Browse Source

简单demo

my 5 years atrás
commit
b032fe5d17
100 changed files with 4045 additions and 0 deletions
  1. 38 0
      .gitignore
  2. 35 0
      db_information_table.sql
  3. 107 0
      info_api/api/pom.xml
  4. 11 0
      info_api/api/src/main/java/xgs/net/ApiStart.java
  5. 49 0
      info_api/api/src/main/java/xgs/net/commons/ApiConfig.java
  6. 89 0
      info_api/api/src/main/java/xgs/net/controller/BaseController.java
  7. 36 0
      info_api/api/src/main/java/xgs/net/controller/InfoListController.java
  8. 30 0
      info_api/api/src/main/java/xgs/net/dev/JettyStartter.java
  9. 13 0
      info_api/api/src/main/java/xgs/net/dev/Startter.java
  10. 35 0
      info_api/api/src/main/java/xgs/net/dev/UndertowStatter.java
  11. 8 0
      info_api/api/src/main/resources/app.properties
  12. 15 0
      info_api/api/src/main/resources/exception.properties
  13. 38 0
      info_api/async-validation/pom.xml
  14. 47 0
      info_api/async-validation/src/main/java/xgs/net/validation/ValidationPluign.java
  15. 186 0
      info_api/async-validation/src/main/java/xgs/net/validation/ValidationUtils.java
  16. 12 0
      info_api/async-validation/src/main/java/xgs/net/validation/XgsValidation.java
  17. 11 0
      info_api/async-validation/src/main/java/xgs/net/validation/annotation/Validation.java
  18. 34 0
      info_api/async-validation/src/main/java/xgs/net/validation/entity/FieldEntity.java
  19. 25 0
      info_api/async-validation/src/main/java/xgs/net/validation/entity/ModelEntity.java
  20. 86 0
      info_api/async-validation/src/main/java/xgs/net/validation/entity/ValidationEntity.java
  21. 39 0
      info_api/async-validation/src/main/java/xgs/net/validation/entity/ValidationErrorMsg.java
  22. 13 0
      info_api/async-validation/src/main/java/xgs/net/validation/impl/AbstractValidation.java
  23. 26 0
      info_api/async-validation/src/main/java/xgs/net/validation/impl/BigIntValidation.java
  24. 14 0
      info_api/async-validation/src/main/java/xgs/net/validation/impl/CreditCardValidation.java
  25. 16 0
      info_api/async-validation/src/main/java/xgs/net/validation/impl/DateFormatValidation.java
  26. 28 0
      info_api/async-validation/src/main/java/xgs/net/validation/impl/DigitsValidation.java
  27. 37 0
      info_api/async-validation/src/main/java/xgs/net/validation/impl/EmailValidation.java
  28. 34 0
      info_api/async-validation/src/main/java/xgs/net/validation/impl/IntegerValidation.java
  29. 33 0
      info_api/async-validation/src/main/java/xgs/net/validation/impl/Ipv4Validation.java
  30. 37 0
      info_api/async-validation/src/main/java/xgs/net/validation/impl/MobileValidation.java
  31. 28 0
      info_api/async-validation/src/main/java/xgs/net/validation/impl/NumberValidation.java
  32. 30 0
      info_api/async-validation/src/main/java/xgs/net/validation/impl/RequiredValidate.java
  33. 34 0
      info_api/async-validation/src/main/java/xgs/net/validation/impl/StringValidate.java
  34. 33 0
      info_api/async-validation/src/main/java/xgs/net/validation/impl/UrlValidation.java
  35. 23 0
      info_api/async-validation/src/main/java/xgs/net/validation/utils/ValidatePool.java
  36. 105 0
      info_api/core/pom.xml
  37. 13 0
      info_api/core/src/main/java/xgs/net/PropUtils.java
  38. 7 0
      info_api/core/src/main/java/xgs/net/Test.java
  39. 44 0
      info_api/core/src/main/java/xgs/net/commons/GeneratorBean.java
  40. 8 0
      info_api/core/src/main/java/xgs/net/commons/XgsController.java
  41. 77 0
      info_api/core/src/main/java/xgs/net/controller/BaseController.java
  42. 23 0
      info_api/core/src/main/java/xgs/net/entity/BaiduLocation.java
  43. 63 0
      info_api/core/src/main/java/xgs/net/entity/LocationEntity.java
  44. 36 0
      info_api/core/src/main/java/xgs/net/entity/Msg.java
  45. 37 0
      info_api/core/src/main/java/xgs/net/entity/PageEntity.java
  46. 22 0
      info_api/core/src/main/java/xgs/net/handle/RenderingTimeHandler.java
  47. 15 0
      info_api/core/src/main/java/xgs/net/handle/SessionHandler.java
  48. 27 0
      info_api/core/src/main/java/xgs/net/handle/Uri404Handle.java
  49. 15 0
      info_api/core/src/main/java/xgs/net/init/InitDb.java
  50. 28 0
      info_api/core/src/main/java/xgs/net/init/MysqlDb.java
  51. 28 0
      info_api/core/src/main/java/xgs/net/init/PostgresDb.java
  52. 95 0
      info_api/core/src/main/java/xgs/net/init/XgsConfig.java
  53. 30 0
      info_api/core/src/main/java/xgs/net/interceptors/AcademyInterceptor.java
  54. 23 0
      info_api/core/src/main/java/xgs/net/interceptors/DomainInterceptor.java
  55. 14 0
      info_api/core/src/main/java/xgs/net/interceptors/InjectInterceptor.java
  56. 31 0
      info_api/core/src/main/java/xgs/net/interceptors/JsonInterceptor.java
  57. 72 0
      info_api/core/src/main/java/xgs/net/interceptors/LogInterceptor.java
  58. 26 0
      info_api/core/src/main/java/xgs/net/interceptors/RestFulInterceptor.java
  59. 29 0
      info_api/core/src/main/java/xgs/net/interceptors/ValidationInterceptor.java
  60. 64 0
      info_api/core/src/main/java/xgs/net/logs/LogPrintStream.java
  61. 78 0
      info_api/core/src/main/java/xgs/net/logs/SLF4JLog.java
  62. 15 0
      info_api/core/src/main/java/xgs/net/logs/SLF4JLogFactory.java
  63. 65 0
      info_api/core/src/main/java/xgs/net/plugin/tips/RuanweiSMS.java
  64. 10 0
      info_api/core/src/main/java/xgs/net/plugin/tips/TipsInterface.java
  65. 28 0
      info_api/core/src/main/java/xgs/net/plugin/tips/ruanwei/interfacej/SmsClientKeyword.java
  66. 23 0
      info_api/core/src/main/java/xgs/net/plugin/tips/ruanwei/interfacej/SmsClientOverage.java
  67. 23 0
      info_api/core/src/main/java/xgs/net/plugin/tips/ruanwei/interfacej/SmsClientQueryCall.java
  68. 23 0
      info_api/core/src/main/java/xgs/net/plugin/tips/ruanwei/interfacej/SmsClientQueryStatusReport.java
  69. 61 0
      info_api/core/src/main/java/xgs/net/plugin/tips/ruanwei/interfacej/SmsClientSend.java
  70. 99 0
      info_api/core/src/main/java/xgs/net/plugin/tips/ruanwei/tool/SmsClientAccessTool.java
  71. 6 0
      info_api/core/src/main/java/xgs/net/query/Filter.java
  72. 31 0
      info_api/core/src/main/java/xgs/net/query/FilterBuilder.java
  73. 56 0
      info_api/core/src/main/java/xgs/net/query/util/LigerEntity.java
  74. 165 0
      info_api/core/src/main/java/xgs/net/query/util/LigerFilter.java
  75. 140 0
      info_api/core/src/main/java/xgs/net/service/BaseService.java
  76. 42 0
      info_api/core/src/main/java/xgs/net/service/InfoListService.java
  77. 39 0
      info_api/core/src/main/java/xgs/net/session/RedisSessionManager.java
  78. 117 0
      info_api/core/src/main/java/xgs/net/session/Session.java
  79. 10 0
      info_api/core/src/main/java/xgs/net/session/SessionManager.java
  80. 90 0
      info_api/core/src/main/java/xgs/net/session/SessionRepositoryRequestWrapper.java
  81. 18 0
      info_api/core/src/main/java/xgs/net/utils/JsonUtils.java
  82. 31 0
      info_api/core/src/main/java/xgs/net/utils/LongToStringSerializer.java
  83. 18 0
      info_api/core/src/main/java/xgs/net/utils/MyJson.java
  84. 27 0
      info_api/core/src/main/java/xgs/net/utils/MyJsonFactory.java
  85. 18 0
      info_api/core/src/main/resources/cfg.properties
  86. 17 0
      info_api/core/src/main/resources/error.properties
  87. 11 0
      info_api/core/src/main/resources/jdbc.properties
  88. 15 0
      info_api/core/src/main/resources/logback.properties
  89. 93 0
      info_api/core/src/main/resources/logback.xml
  90. 2 0
      info_api/core/src/main/resources/mchange-log.properties
  91. 17 0
      info_api/core/src/main/resources/model_template.jf
  92. 220 0
      info_api/core/src/main/resources/validation.json
  93. 1 0
      info_api/core/src/main/resources/validation.properties
  94. 23 0
      info_api/core/src/main/resources/validation.xml
  95. BIN
      info_api/dump.rdb
  96. 34 0
      info_api/entity/pom.xml
  97. 51 0
      info_api/entity/src/main/java/genrator/GeneratorBean.java
  98. 25 0
      info_api/entity/src/main/java/xgs/net/entity/Item.java
  99. 41 0
      info_api/entity/src/main/java/xgs/net/entity/OperaterEntity.java
  100. 0 0
      info_api/entity/src/main/java/xgs/net/model/TbInfoList.java

+ 38 - 0
.gitignore

@@ -0,0 +1,38 @@
+.DS_Store
+
+#ui
+info_ui/.DS_Store
+info_ui/node_modules/
+info_ui/dist/
+info_ui/npm-debug.log*
+info_ui/yarn-debug.log*
+info_ui/yarn-error.log*
+info_ui/package-lock.json
+
+#service
+info_api/.idea/*
+info_api/.idea
+info_api/out
+info_api/*/target
+info_api/*/out/
+info_api/out
+info_api/*/logs/
+info_api/*/.settings/
+info_api/*/.classpath
+info_api/*/.project
+info_api/.settings/
+info_api/.project
+info_api/*.iml
+info_api/*/*.iml
+info_api/*/bin
+info_api/logs
+info_api/*.iml
+
+
+# Editor directories and files
+.idea
+.vscode
+*.suo
+*.ntvs*
+*.njsproj
+*.sln

+ 35 - 0
db_information_table.sql

@@ -0,0 +1,35 @@
+/*
+ Navicat Premium Data Transfer
+
+ Source Server         : localhost
+ Source Server Type    : MySQL
+ Source Server Version : 50725
+ Source Host           : 127.0.0.1:3306
+ Source Schema         : db_information_table
+
+ Target Server Type    : MySQL
+ Target Server Version : 50725
+ File Encoding         : 65001
+
+ Date: 06/06/2019 10:59:19
+*/
+
+SET NAMES utf8mb4;
+SET FOREIGN_KEY_CHECKS = 0;
+
+-- ----------------------------
+-- Table structure for tb_info_list
+-- ----------------------------
+DROP TABLE IF EXISTS `tb_info_list`;
+CREATE TABLE `tb_info_list` (
+  `id` bigint(20) NOT NULL,
+  `type` varchar(64) COLLATE utf8mb4_bin NOT NULL,
+  `name` varchar(64) COLLATE utf8mb4_bin NOT NULL,
+  `phone` varchar(11) COLLATE utf8mb4_bin NOT NULL,
+  `email` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL,
+  `remark` varchar(1024) COLLATE utf8mb4_bin DEFAULT NULL,
+  `created` bigint(20) NOT NULL,
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
+
+SET FOREIGN_KEY_CHECKS = 1;

+ 107 - 0
info_api/api/pom.xml

@@ -0,0 +1,107 @@
+<?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>vipp</artifactId>
+        <groupId>xgs.net</groupId>
+        <version>1.0</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>api</artifactId>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.jfinal</groupId>
+            <artifactId>jfinal</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>xgs.net</groupId>
+            <artifactId>core</artifactId>
+            <version>1.0</version>
+        </dependency>
+
+        <dependency>
+            <groupId>javax.servlet</groupId>
+            <artifactId>javax.servlet-api</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>io.undertow</groupId>
+            <artifactId>undertow-servlet</artifactId>
+        </dependency>
+
+
+        <dependency>
+            <groupId>org.eclipse.jetty</groupId>
+            <artifactId>jetty-server</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.eclipse.jetty</groupId>
+            <artifactId>jetty-webapp</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.eclipse.jetty</groupId>
+            <artifactId>jetty-jsp</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>redis.clients</groupId>
+            <artifactId>jedis</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-pool2</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>xgs.net</groupId>
+            <artifactId>rbac</artifactId>
+            <version>1.0</version>
+        </dependency>
+        <dependency>
+            <groupId>xgs.net</groupId>
+            <artifactId>mvc</artifactId>
+            <version>1.0</version>
+        </dependency>
+        <dependency>
+            <groupId>xgs.net</groupId>
+            <artifactId>utils</artifactId>
+            <version>1.0</version>
+        </dependency>
+    </dependencies>
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-jar-plugin</artifactId>
+                <configuration>
+                    <archive>
+                        <manifest>
+                            <addClasspath>true</addClasspath>
+                            <classpathPrefix>lib/</classpathPrefix>
+                            <mainClass>xgs.net.ApiStart</mainClass>
+                        </manifest>
+                    </archive>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-dependency-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>copy</id>
+                        <phase>install</phase>
+                        <goals>
+                            <goal>copy-dependencies</goal>
+                        </goals>
+                        <configuration>
+                            <outputDirectory>${project.build.directory}/lib/</outputDirectory>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+</project>

+ 11 - 0
info_api/api/src/main/java/xgs/net/ApiStart.java

@@ -0,0 +1,11 @@
+package xgs.net;
+
+import xgs.net.dev.Startter;
+
+public class ApiStart
+{
+    public static void main(final String[] args) throws Exception {
+        final Startter startter = (Startter)Class.forName(Startter.prop.get("system.start.clazz")).newInstance();
+        startter.start();
+    }
+}

+ 49 - 0
info_api/api/src/main/java/xgs/net/commons/ApiConfig.java

@@ -0,0 +1,49 @@
+package xgs.net.commons;
+
+import com.jfinal.config.Constants;
+import com.jfinal.config.Handlers;
+import com.jfinal.config.Interceptors;
+import com.jfinal.config.Plugins;
+import xgs.net.init.XgsConfig;
+import xgs.net.interceptors.*;
+import xgs.net.plugin.IocPlugin;
+import xgs.net.utils.MyJsonFactory;
+
+import java.io.File;
+import java.net.URL;
+
+public class ApiConfig extends XgsConfig
+{
+    public void constant(Constants me) {
+        me.setJsonFactory(new MyJsonFactory());
+    }
+    
+    public void plugin(Plugins me) {
+        String[] pkgs = { "xgs.net" };
+        IocPlugin ioc = new IocPlugin(pkgs);
+        me.add(ioc);
+        this.routes.add(ioc.getRoutes());
+    }
+    
+    private File getFile(String fileName) {
+        final URL url = this.getClassLoader().getResource(fileName);
+        return new File(url.getFile());
+    }
+    
+    private ClassLoader getClassLoader() {
+        final ClassLoader ret = Thread.currentThread().getContextClassLoader();
+        return (ret != null) ? ret : this.getClass().getClassLoader();
+    }
+    
+    public void interceptor(Interceptors me) {
+        me.addGlobalActionInterceptor(new DomainInterceptor());
+        me.addGlobalActionInterceptor(new RestFulInterceptor());
+//        me.addGlobalActionInterceptor(new ValidationInterceptor());
+//        me.addGlobalActionInterceptor(new AcademyInterceptor());
+        me.addGlobalActionInterceptor(new JsonInterceptor());
+        //me.addGlobalActionInterceptor(new AreaInterceptor());
+    }
+    
+    public void handler(final Handlers me) {
+    }
+}

+ 89 - 0
info_api/api/src/main/java/xgs/net/controller/BaseController.java

@@ -0,0 +1,89 @@
+package xgs.net.controller;
+
+
+import com.jfinal.core.Controller;
+import com.jfinal.plugin.redis.Cache;
+import com.jfinal.plugin.redis.Redis;
+
+import xgs.net.entity.Msg;
+
+import xgs.net.entity.OperaterEntity;
+import xgs.net.entity.PageEntity;
+import xgs.net.interceptors.ValidationInterceptor;
+//import xgs.net.model.TbUser;
+import xgs.net.token.JwtToken;
+import xgs.net.utils.WebUtils;
+
+
+public class BaseController extends Controller
+{
+    private static final String memberSession = "group";
+    private static final int expire = 7*60*60*24;
+    protected static Cache redis;
+    
+    protected String generateKey(String JwtToken) {
+        return memberSession + "-" + JwtToken;
+    }
+    
+//    protected void cacheToken(String JwtToken, TbUser user) {
+//        BaseController.redis.setex(this.generateKey(JwtToken), expire, user);
+//    }
+    
+    protected PageEntity getPage() {
+        PageEntity entity = new PageEntity();
+        entity.setPageNo(this.getParaToInt("pageNumber", 1));
+        entity.setPageSize(this.getParaToInt("pageSize", 10));
+        return entity;
+    }
+    
+//    public TbUser getUser() {
+//        try{
+//            String token = this.getRequest().getHeader(ValidationInterceptor.XToken);
+//            if(token == null) return null;
+//            String key = this.generateKey(token);
+//            TbUser user = BaseController.redis.get(this.generateKey(token));
+//            if (user != null) {
+//                redis.expire(key, expire);
+//            }
+//            return user;
+//        }catch (Exception e){
+//            return null;
+//        }
+//    }
+//
+    protected void renderMyJson(Msg msg) {
+        this.renderJson(msg);
+    }
+    
+//    protected OperaterEntity getOperaterEntity() {
+//        OperaterEntity operaterEntity = new OperaterEntity();
+//        operaterEntity.setOperateTime(System.currentTimeMillis());
+//        operaterEntity.setOperateIp(WebUtils.getIP(this.getRequest()));
+//        operaterEntity.setOperator(this.getUser().getUserNick());
+//        operaterEntity.setOperatorId(this.getUser().getId());
+//        return operaterEntity;
+//    }
+
+    protected void cleanToken(){
+        String token = this.getRequest().getHeader(ValidationInterceptor.XToken);
+        String key = this.generateKey(token);
+        redis.del(key);
+    }
+//
+//    protected Msg setToken(TbUser user) {
+//        String token = JwtToken.createToken(user.getId());
+//        this.cacheToken(token, user);
+//        user.put(ValidationInterceptor.XToken, token);
+//        Msg msg = new Msg();
+//        user.setSalt(null);
+//        user.setPwd(null);
+//        user.setStatus(null);
+//        user.removeNullValueAttrs();
+//        msg.setData(user);
+//        return msg;
+//    }
+
+    static {
+        redis = Redis.use();
+    }
+}

+ 36 - 0
info_api/api/src/main/java/xgs/net/controller/InfoListController.java

@@ -0,0 +1,36 @@
+package xgs.net.controller;
+
+import xgs.net.annotation.ControllerKey;
+import xgs.net.annotation.Method;
+import xgs.net.annotation.Service;
+import xgs.net.entity.Msg;
+import xgs.net.plugin.ioc.IocKit;
+import xgs.net.service.InfoListService;
+
+@ControllerKey("li")
+public class InfoListController extends BaseController {
+
+    private InfoListService infoListService = IocKit.getBean(InfoListService.class);
+
+    @Method(Method.TYPE.POST)
+    public void save(){
+        String name = this.getPara("name");
+        String collega = this.getPara("collega");
+        String type = this.getPara("type");
+        String phone = this.getPara("mobile");
+        String postion = this.getPara("postion");
+        Integer isParty = this.getParaToInt("isParty");
+        String work = this.getPara("work");
+        Long sendDate = this.getParaToLong("sendDate");
+        infoListService.save(name,collega,type,postion,phone,isParty,work,sendDate);
+        this.renderMyJson(new Msg());
+    }
+
+    @Method(Method.TYPE.POST)
+    public void page(){
+        Msg msg = new Msg();
+        String type = this.getPara("type");
+        msg.setData(infoListService.page(this.getPage(),type));
+        this.renderMyJson(msg);
+    }
+}

+ 30 - 0
info_api/api/src/main/java/xgs/net/dev/JettyStartter.java

@@ -0,0 +1,30 @@
+package xgs.net.dev;
+
+import com.jfinal.core.JFinalFilter;
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.servlet.FilterHolder;
+import org.eclipse.jetty.webapp.WebAppContext;
+
+import javax.servlet.DispatcherType;
+import java.util.EnumSet;
+
+public class JettyStartter implements Startter
+{
+    @Override
+    public void start() {
+        final EnumSet<DispatcherType> all = EnumSet.of(DispatcherType.ASYNC, DispatcherType.ERROR, DispatcherType.FORWARD, DispatcherType.INCLUDE, DispatcherType.REQUEST);
+        final Server server = new Server(JettyStartter.prop.getInt("system.start.port", 80));
+        try {
+            final WebAppContext context = new WebAppContext("/", "/");
+            final FilterHolder filter = new FilterHolder(new JFinalFilter());
+            filter.setInitParameter("configClass", JettyStartter.prop.get("system.start.configClazz"));
+            context.addFilter(filter, "/*", all);
+            server.setHandler(context);
+            server.start();
+            server.join();
+        }
+        catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+}

+ 13 - 0
info_api/api/src/main/java/xgs/net/dev/Startter.java

@@ -0,0 +1,13 @@
+package xgs.net.dev;
+
+import com.jfinal.kit.Prop;
+import com.jfinal.kit.PropKit;
+
+import javax.servlet.ServletException;
+
+public interface Startter
+{
+    public static final Prop prop = PropKit.use("app.properties");
+    
+    void start() throws ServletException;
+}

+ 35 - 0
info_api/api/src/main/java/xgs/net/dev/UndertowStatter.java

@@ -0,0 +1,35 @@
+package xgs.net.dev;
+
+import com.jfinal.core.JFinalFilter;
+import io.undertow.Handlers;
+import io.undertow.Undertow;
+import io.undertow.server.HttpHandler;
+import io.undertow.server.handlers.PathHandler;
+import io.undertow.servlet.Servlets;
+import io.undertow.servlet.api.DeploymentInfo;
+import io.undertow.servlet.api.DeploymentManager;
+import io.undertow.servlet.api.FilterInfo;
+import xgs.net.ApiStart;
+
+import javax.servlet.DispatcherType;
+import javax.servlet.ServletException;
+
+public class UndertowStatter implements Startter
+{
+    @Override
+    public void start() throws ServletException {
+        final String MYAPP = "/";
+        final DeploymentInfo di = Servlets.deployment().setClassLoader(ApiStart.class.getClassLoader()).setDeploymentName("app.war").setContextPath(MYAPP);
+        di.setEagerFilterInit(true);
+        final FilterInfo info = new FilterInfo("jfinal", JFinalFilter.class);
+        info.addInitParam("configClass", UndertowStatter.prop.get("system.start.configClazz"));
+        di.addFilter(info);
+        di.addFilterUrlMapping("jfinal", "/*", DispatcherType.REQUEST);
+        final DeploymentManager manager = Servlets.defaultContainer().addDeployment(di);
+        manager.deploy();
+        final HttpHandler servletHandler = manager.start();
+        final PathHandler path = Handlers.path(servletHandler);
+        final Undertow server = Undertow.builder().addHttpListener(UndertowStatter.prop.getInt("system.start.port", 80), "0.0.0.0").setHandler(path).build();
+        server.start();
+    }
+}

+ 8 - 0
info_api/api/src/main/resources/app.properties

@@ -0,0 +1,8 @@
+system.start.clazz=xgs.net.dev.UndertowStatter
+system.start.port=9980
+system.start.configClazz=xgs.net.commons.ApiConfig
+system.annotation.scan=xgs.net.controller,xgs.net.service
+wx.session.clazz=xgs.net.session.RedisSessionManager
+wx.session.maxAgeInSeconds=30
+wx.session.cookieName=xgsSession
+

+ 15 - 0
info_api/api/src/main/resources/exception.properties

@@ -0,0 +1,15 @@
+404=\u8BBF\u95EE\u5730\u5740\u9519\u8BEF
+500=\u7CFB\u7EDF\u5185\u90E8\u9519\u8BEF
+1000=\u8981\u6302\u63A5\u7684\u83DC\u5355\u4E0D\u5B58\u5728
+
+2000=\u7528\u6237\u540D\u6216\u5BC6\u7801\u9519\u8BEF
+2001=\u5FAE\u4FE1\u767B\u9646\u5931\u8D25
+2002=\u9A8C\u8BC1\u7801\u9519\u8BEF
+2003=\u8BE5\u4F01\u4E1A\u88AB\u7981\u7528
+2004=\u6B63\u5728\u5BA1\u6838\u4E2D
+2005=\u5BA1\u6838\u672A\u901A\u8FC7
+
+2100=\u81EA\u5DF1\u505A\u4E0D\u80FD\u505A\u81EA\u5DF1\u7684\u4E0A\u7EA7
+2101=\u5F85\u5220\u9664\u7684\u90E8\u95E8\u4E0D\u5B58\u5728\uFF0C\u65E0\u6CD5\u5220\u9664
+2102=\u5F53\u524D\u90E8\u95E8\u4E0B\u9762\u6709\u5B50\u90E8\u95E8\uFF0C\u65E0\u6CD5\u5220\u9664
+2103=\u5F53\u524D\u90E8\u95E8\u4E0B\u9762\u6709\u7528\u6237\uFF0C\u65E0\u6CD5\u5220\u9664

+ 38 - 0
info_api/async-validation/pom.xml

@@ -0,0 +1,38 @@
+<?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>vipp</artifactId>
+        <groupId>xgs.net</groupId>
+        <version>1.0</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>async-validation</artifactId>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.jfinal</groupId>
+            <artifactId>jfinal</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>xgs.net</groupId>
+            <artifactId>utils</artifactId>
+            <version>1.0</version>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.google.guava</groupId>
+            <artifactId>guava</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>xgs.net</groupId>
+            <artifactId>entity</artifactId>
+            <version>1.0</version>
+        </dependency>
+    </dependencies>
+</project>

+ 47 - 0
info_api/async-validation/src/main/java/xgs/net/validation/ValidationPluign.java

@@ -0,0 +1,47 @@
+package xgs.net.validation;
+
+import com.jfinal.plugin.IPlugin;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import xgs.net.searcher.ClassSearcher;
+import xgs.net.validation.annotation.Validation;
+import xgs.net.validation.utils.ValidatePool;
+
+import java.io.InputStream;
+import java.util.Set;
+
+public class ValidationPluign implements IPlugin
+{
+    Logger logger;
+    private String[] pkgs;
+    private InputStream file;
+    
+    public ValidationPluign(final InputStream file, final String... pkgs) {
+        this.logger = LoggerFactory.getLogger((Class)ValidationPluign.class);
+        this.pkgs = pkgs;
+        this.file = file;
+    }
+    
+    public boolean start() {
+        ValidationUtils.init(this.file);
+        final Set<Class<?>> classes = (Set<Class<?>>)ClassSearcher.getClasses(this.pkgs, new Class[] { Validation.class });
+        for (final Class clazz : classes) {
+            final Validation validation = (Validation) clazz.getAnnotation(Validation.class);
+            if (validation != null) {
+                try {
+                    ValidatePool.init(validation.value(), (XgsValidation) clazz.newInstance());
+                }
+                catch (Exception e) {
+                    e.printStackTrace();
+                    this.logger.error("\u521d\u59cb\u5316\u68c0\u9a8c\u63d2\u4ef6\u5931\u8d25", (Throwable)e);
+                    return false;
+                }
+            }
+        }
+        return true;
+    }
+    
+    public boolean stop() {
+        return true;
+    }
+}

+ 186 - 0
info_api/async-validation/src/main/java/xgs/net/validation/ValidationUtils.java

@@ -0,0 +1,186 @@
+package xgs.net.validation;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.google.common.collect.Maps;
+import com.jfinal.plugin.activerecord.Model;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import xgs.net.annotation.Entity;
+import xgs.net.exception.XgsException;
+//import xgs.net.model.TbSysUser;
+import xgs.net.utils.IOUtils;
+import xgs.net.validation.entity.FieldEntity;
+import xgs.net.validation.entity.ModelEntity;
+import xgs.net.validation.entity.ValidationEntity;
+import xgs.net.validation.entity.ValidationErrorMsg;
+import xgs.net.validation.utils.ValidatePool;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+
+public class ValidationUtils
+{
+    static Logger logger;
+    private static final String xgsType = "xgsType";
+    private static final String message = "message";
+    private static final String required = "required";
+    private static final String mobile = "mobile";
+    private static final String email = "email";
+    private static final String type = "type";
+    private static final String max = "max";
+    private static final String min = "min";
+    private static final String len = "len";
+    private static JSONObject json;
+    private static Map<String, ModelEntity> entities;
+    private static Map<String, String> jsonEntities;
+    
+    private ValidationUtils(InputStream file) {
+        try {
+            String jsonStr = IOUtils.toString(file);
+            ValidationUtils.json = JSON.parseObject(jsonStr);
+            Set<String> tableSet = ValidationUtils.json.keySet();
+            for (String tableName : tableSet) {
+                JSONObject _jsonObj = ValidationUtils.json.getJSONObject(tableName);
+                ValidationUtils.jsonEntities.put(tableName, JSON.toJSONString(_jsonObj));
+                ValidationUtils.entities.put(tableName, this.initModel(tableName, _jsonObj));
+            }
+        }
+        catch (IOException e) {
+            throw new XgsException(303);
+        }
+    }
+    
+    private ModelEntity initModel(final String tableName, final JSONObject _jsonObj) {
+        final ModelEntity model = new ModelEntity();
+        model.setTable(tableName);
+        final Set<String> fields = _jsonObj.keySet();
+        final List<FieldEntity> fieldEntityList = new ArrayList<>();
+        model.setEntities(fieldEntityList);
+        for (final String field : fields) {
+            final JSONObject _property = _jsonObj.getJSONObject(field);
+            fieldEntityList.add(this.initField(field, _property));
+        }
+        return model;
+    }
+    
+    private FieldEntity initField(final String field, final JSONObject _property) {
+        final FieldEntity fieldEntity = new FieldEntity();
+        final String label = _property.getString("label");
+        fieldEntity.setLabel(label);
+        fieldEntity.setField(field);
+        final JSONArray validationArray = _property.getJSONArray("validation");
+        final List<ValidationEntity> validationEntityList = new ArrayList<>();
+        fieldEntity.setEntities(validationEntityList);
+        if (validationArray != null && validationArray.size() != 0) {
+            for (final Object validation : validationArray) {
+                validationEntityList.add(this.initValidation(validation));
+            }
+        }
+        return fieldEntity;
+    }
+    
+    private ValidationEntity initValidation(final Object validation) {
+        final JSONObject v = (JSONObject)validation;
+        final ValidationEntity validationEntity = new ValidationEntity();
+        validationEntity.setXgsType(v.getString("xgsType"));
+        validationEntity.setMessage(v.getString("message"));
+        if (v.containsKey("required")) {
+            validationEntity.setRequired(v.getBoolean("required"));
+        }
+        if (v.containsKey("type")) {
+            validationEntity.setType(v.getString("type"));
+        }
+        if (v.containsKey("max")) {
+            validationEntity.setMax(v.getInteger("max"));
+        }
+        if (v.containsKey("min")) {
+            validationEntity.setMin(v.getInteger("min"));
+        }
+        if (v.containsKey("len")) {
+            validationEntity.setLen(v.getInteger("len"));
+        }
+        if (v.containsKey("email")) {
+            validationEntity.setEmail(v.getBoolean("email"));
+        }
+        if (v.containsKey("mobile")) {
+            validationEntity.setMobile(v.getBoolean("mobile"));
+        }
+        return validationEntity;
+    }
+    
+    static void init(final InputStream file) {
+        if (ValidationUtils.json == null) {
+            new ValidationUtils(file);
+        }
+    }
+    
+    public static String getModelName(final Model model) {
+        final Class<?> clazz = model.getClass();
+        return getModelName(clazz);
+    }
+    
+    public static String getModelName(final Class<?> clazz) {
+        final Entity entity = clazz.getAnnotation(Entity.class);
+        return entity.value();
+    }
+    
+    public static String getJson(final Class<?> clazz) {
+        return ValidationUtils.jsonEntities.get(getModelName(clazz));
+    }
+    
+    public static String getJson(final Model model) {
+        return ValidationUtils.jsonEntities.get(getModelName(model));
+    }
+    
+    public static Map<String, ValidationErrorMsg> validate(final Model model) {
+        final Map<String, ValidationErrorMsg> errors = Maps.newHashMap();
+        final String table = getModelName(model);
+        final ModelEntity entity = ValidationUtils.entities.get(table);
+        final List<FieldEntity> fields = entity.getEntities();
+        for (final FieldEntity field : fields) {
+            final ValidationErrorMsg errorMsg = new ValidationErrorMsg();
+            errorMsg.setField(field.getField());
+            errorMsg.setLabel(field.getLabel());
+            final List<ValidationEntity> validationEntityList = field.getEntities();
+            for (final ValidationEntity v : validationEntityList) {
+                check(entity, field, v, model, errorMsg);
+            }
+            if (errorMsg.getErrors().size() != 0) {
+                errors.put(field.getField(), errorMsg);
+            }
+        }
+        return errors;
+    }
+    
+    public static void validateE(final Model model) throws XgsException {
+        final Map<String, ValidationErrorMsg> errors = validate(model);
+        if (errors.size() != 0) {
+            ValidationUtils.logger.debug("validation error:{}", JSON.toJSONString(errors));
+            throw new XgsException(10000, JSON.toJSONString(errors));
+        }
+    }
+    
+    private static void check(final ModelEntity me, final FieldEntity field, final ValidationEntity entity, final Model model, final ValidationErrorMsg errorMsg) {
+        final XgsValidation xv = ValidatePool.get(entity.getXgsType());
+        xv.executor(me, field, entity, model, errorMsg);
+    }
+
+    public static void main(final String[] args) {
+//        final TbSysUser user = new TbSysUser();
+//        System.out.println(getJson(user));
+//        System.out.println(getJson(TbSysUser.class));
+    }
+    
+    static {
+        ValidationUtils.logger = LoggerFactory.getLogger(ValidationUtils.class);
+        ValidationUtils.entities = new ConcurrentHashMap<>();
+        ValidationUtils.jsonEntities = new ConcurrentHashMap<>();
+    }
+}

+ 12 - 0
info_api/async-validation/src/main/java/xgs/net/validation/XgsValidation.java

@@ -0,0 +1,12 @@
+package xgs.net.validation;
+
+import com.jfinal.plugin.activerecord.Model;
+import xgs.net.validation.entity.FieldEntity;
+import xgs.net.validation.entity.ModelEntity;
+import xgs.net.validation.entity.ValidationEntity;
+import xgs.net.validation.entity.ValidationErrorMsg;
+
+public interface XgsValidation
+{
+    void executor(final ModelEntity p0, final FieldEntity p1, final ValidationEntity p2, final Model p3, final ValidationErrorMsg p4);
+}

+ 11 - 0
info_api/async-validation/src/main/java/xgs/net/validation/annotation/Validation.java

@@ -0,0 +1,11 @@
+package xgs.net.validation.annotation;
+
+import java.lang.annotation.*;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ ElementType.TYPE })
+@Documented
+@Inherited
+public @interface Validation {
+    String value();
+}

+ 34 - 0
info_api/async-validation/src/main/java/xgs/net/validation/entity/FieldEntity.java

@@ -0,0 +1,34 @@
+package xgs.net.validation.entity;
+
+import java.util.List;
+
+public class FieldEntity
+{
+    private String field;
+    private String label;
+    private List<ValidationEntity> entities;
+    
+    public String getField() {
+        return this.field;
+    }
+    
+    public void setField(final String field) {
+        this.field = field;
+    }
+    
+    public String getLabel() {
+        return this.label;
+    }
+    
+    public void setLabel(final String label) {
+        this.label = label;
+    }
+    
+    public List<ValidationEntity> getEntities() {
+        return this.entities;
+    }
+    
+    public void setEntities(final List<ValidationEntity> entities) {
+        this.entities = entities;
+    }
+}

+ 25 - 0
info_api/async-validation/src/main/java/xgs/net/validation/entity/ModelEntity.java

@@ -0,0 +1,25 @@
+package xgs.net.validation.entity;
+
+import java.util.List;
+
+public class ModelEntity
+{
+    private String table;
+    private List<FieldEntity> entities;
+    
+    public String getTable() {
+        return this.table;
+    }
+    
+    public void setTable(final String table) {
+        this.table = table;
+    }
+    
+    public List<FieldEntity> getEntities() {
+        return this.entities;
+    }
+    
+    public void setEntities(final List<FieldEntity> entities) {
+        this.entities = entities;
+    }
+}

+ 86 - 0
info_api/async-validation/src/main/java/xgs/net/validation/entity/ValidationEntity.java

@@ -0,0 +1,86 @@
+package xgs.net.validation.entity;
+
+public class ValidationEntity
+{
+    private String xgsType;
+    private String message;
+    private Boolean required;
+    private Boolean mobile;
+    private Boolean email;
+    private String type;
+    private Integer max;
+    private Integer min;
+    private Integer len;
+    
+    public String getXgsType() {
+        return this.xgsType;
+    }
+    
+    public void setXgsType(final String xgsType) {
+        this.xgsType = xgsType;
+    }
+    
+    public String getMessage() {
+        return this.message;
+    }
+    
+    public void setMessage(final String message) {
+        this.message = message;
+    }
+    
+    public Boolean getRequired() {
+        return this.required;
+    }
+    
+    public void setRequired(final Boolean required) {
+        this.required = required;
+    }
+    
+    public String getType() {
+        return this.type;
+    }
+    
+    public void setType(final String type) {
+        this.type = type;
+    }
+    
+    public Integer getMax() {
+        return this.max;
+    }
+    
+    public void setMax(final Integer max) {
+        this.max = max;
+    }
+    
+    public Integer getMin() {
+        return this.min;
+    }
+    
+    public void setMin(final Integer min) {
+        this.min = min;
+    }
+    
+    public Integer getLen() {
+        return this.len;
+    }
+    
+    public void setLen(final Integer len) {
+        this.len = len;
+    }
+    
+    public Boolean getMobile() {
+        return this.mobile;
+    }
+    
+    public void setMobile(final Boolean mobile) {
+        this.mobile = mobile;
+    }
+    
+    public Boolean getEmail() {
+        return this.email;
+    }
+    
+    public void setEmail(final Boolean email) {
+        this.email = email;
+    }
+}

+ 39 - 0
info_api/async-validation/src/main/java/xgs/net/validation/entity/ValidationErrorMsg.java

@@ -0,0 +1,39 @@
+package xgs.net.validation.entity;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class ValidationErrorMsg
+{
+    private String field;
+    private String label;
+    private List<String> errors;
+    
+    public ValidationErrorMsg() {
+        this.errors = new ArrayList<String>();
+    }
+    
+    public String getField() {
+        return this.field;
+    }
+    
+    public void setField(final String field) {
+        this.field = field;
+    }
+    
+    public String getLabel() {
+        return this.label;
+    }
+    
+    public void setLabel(final String label) {
+        this.label = label;
+    }
+    
+    public List<String> getErrors() {
+        return this.errors;
+    }
+    
+    public void setErrors(final List<String> errors) {
+        this.errors = errors;
+    }
+}

+ 13 - 0
info_api/async-validation/src/main/java/xgs/net/validation/impl/AbstractValidation.java

@@ -0,0 +1,13 @@
+package xgs.net.validation.impl;
+
+import com.jfinal.plugin.activerecord.Model;
+import xgs.net.validation.XgsValidation;
+import xgs.net.validation.entity.FieldEntity;
+
+public abstract class AbstractValidation implements XgsValidation
+{
+    protected String getStr(final Model model, final FieldEntity fe) {
+        final String value = String.valueOf(model.get(fe.getField()));
+        return (value == null) ? "" : value;
+    }
+}

+ 26 - 0
info_api/async-validation/src/main/java/xgs/net/validation/impl/BigIntValidation.java

@@ -0,0 +1,26 @@
+package xgs.net.validation.impl;
+
+import com.jfinal.plugin.activerecord.Model;
+import xgs.net.validation.annotation.Validation;
+import xgs.net.validation.entity.FieldEntity;
+import xgs.net.validation.entity.ModelEntity;
+import xgs.net.validation.entity.ValidationEntity;
+import xgs.net.validation.entity.ValidationErrorMsg;
+
+import java.math.BigInteger;
+
+@Validation("bigint")
+public class BigIntValidation extends AbstractValidation
+{
+    @Override
+    public void executor(final ModelEntity me, final FieldEntity fe, final ValidationEntity ve, final Model model, final ValidationErrorMsg errorMsg) {
+        if (model.get(fe.getField()) == null) {
+            return;
+        }
+        final Object obj = model.get(fe.getField());
+        if (obj instanceof Long || obj instanceof BigInteger) {
+            return;
+        }
+        errorMsg.getErrors().add(ve.getMessage());
+    }
+}

+ 14 - 0
info_api/async-validation/src/main/java/xgs/net/validation/impl/CreditCardValidation.java

@@ -0,0 +1,14 @@
+package xgs.net.validation.impl;
+
+import com.jfinal.plugin.activerecord.Model;
+import xgs.net.validation.entity.FieldEntity;
+import xgs.net.validation.entity.ModelEntity;
+import xgs.net.validation.entity.ValidationEntity;
+import xgs.net.validation.entity.ValidationErrorMsg;
+
+public class CreditCardValidation extends AbstractValidation
+{
+    @Override
+    public void executor(final ModelEntity me, final FieldEntity fe, final ValidationEntity ve, final Model model, final ValidationErrorMsg errorMsg) {
+    }
+}

+ 16 - 0
info_api/async-validation/src/main/java/xgs/net/validation/impl/DateFormatValidation.java

@@ -0,0 +1,16 @@
+package xgs.net.validation.impl;
+
+import com.jfinal.plugin.activerecord.Model;
+import xgs.net.validation.annotation.Validation;
+import xgs.net.validation.entity.FieldEntity;
+import xgs.net.validation.entity.ModelEntity;
+import xgs.net.validation.entity.ValidationEntity;
+import xgs.net.validation.entity.ValidationErrorMsg;
+
+@Validation("date")
+public class DateFormatValidation extends AbstractValidation
+{
+    @Override
+    public void executor(final ModelEntity me, final FieldEntity fe, final ValidationEntity ve, final Model model, final ValidationErrorMsg errorMsg) {
+    }
+}

+ 28 - 0
info_api/async-validation/src/main/java/xgs/net/validation/impl/DigitsValidation.java

@@ -0,0 +1,28 @@
+package xgs.net.validation.impl;
+
+import com.jfinal.plugin.activerecord.Model;
+import xgs.net.validation.annotation.Validation;
+import xgs.net.validation.entity.FieldEntity;
+import xgs.net.validation.entity.ModelEntity;
+import xgs.net.validation.entity.ValidationEntity;
+import xgs.net.validation.entity.ValidationErrorMsg;
+
+@Validation("digits")
+public class DigitsValidation extends AbstractValidation
+{
+    @Override
+    public void executor(final ModelEntity me, final FieldEntity fe, final ValidationEntity ve, final Model model, final ValidationErrorMsg errorMsg) {
+        if (model.get(fe.getField()) == null) {
+            return;
+        }
+        try {
+            final int _v = model.getInt(fe.getField());
+            if (_v < 0) {
+                errorMsg.getErrors().add(ve.getMessage());
+            }
+        }
+        catch (Exception e) {
+            errorMsg.getErrors().add(ve.getMessage());
+        }
+    }
+}

+ 37 - 0
info_api/async-validation/src/main/java/xgs/net/validation/impl/EmailValidation.java

@@ -0,0 +1,37 @@
+package xgs.net.validation.impl;
+
+import com.jfinal.plugin.activerecord.Model;
+import xgs.net.validation.annotation.Validation;
+import xgs.net.validation.entity.FieldEntity;
+import xgs.net.validation.entity.ModelEntity;
+import xgs.net.validation.entity.ValidationEntity;
+import xgs.net.validation.entity.ValidationErrorMsg;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+@Validation("email")
+public class EmailValidation extends AbstractValidation
+{
+    private static final String regex = "^[a-z0-9\\u007F-\\uffff!#$%&'*+\\/=?^_`{|}~-]+(?:\\.[a-z0-9\\u007F-\\uffff!#$%&'*+\\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z]{2,}$";
+    private static final Pattern pattern;
+    
+    @Override
+    public void executor(final ModelEntity me, final FieldEntity fe, final ValidationEntity ve, final Model model, final ValidationErrorMsg errorMsg) {
+        if (!ve.getEmail()) {
+            return;
+        }
+        if (model.get(fe.getField()) == null) {
+            return;
+        }
+        final String value = this.getStr(model, fe);
+        final Matcher matcher = EmailValidation.pattern.matcher(value.toLowerCase());
+        if (!matcher.find()) {
+            errorMsg.getErrors().add(ve.getMessage());
+        }
+    }
+    
+    static {
+        pattern = Pattern.compile("^[a-z0-9\\u007F-\\uffff!#$%&'*+\\/=?^_`{|}~-]+(?:\\.[a-z0-9\\u007F-\\uffff!#$%&'*+\\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z]{2,}$");
+    }
+}

+ 34 - 0
info_api/async-validation/src/main/java/xgs/net/validation/impl/IntegerValidation.java

@@ -0,0 +1,34 @@
+package xgs.net.validation.impl;
+
+import com.jfinal.plugin.activerecord.Model;
+import xgs.net.validation.annotation.Validation;
+import xgs.net.validation.entity.FieldEntity;
+import xgs.net.validation.entity.ModelEntity;
+import xgs.net.validation.entity.ValidationEntity;
+import xgs.net.validation.entity.ValidationErrorMsg;
+
+@Validation("integer")
+public class IntegerValidation extends AbstractValidation
+{
+    @Override
+    public void executor(final ModelEntity me, final FieldEntity fe, final ValidationEntity ve, final Model model, final ValidationErrorMsg errorMsg) {
+        if (model.get(fe.getField()) == null) {
+            return;
+        }
+        try {
+            final int v = model.getInt(fe.getField());
+            if (ve.getMin() != null && v < ve.getMin()) {
+                errorMsg.getErrors().add(ve.getMessage());
+            }
+            else if (ve.getMax() != null && v > ve.getMax()) {
+                errorMsg.getErrors().add(ve.getMessage());
+            }
+            else if (ve.getLen() != null && v == ve.getLen()) {
+                errorMsg.getErrors().add(ve.getMessage());
+            }
+        }
+        catch (Exception e) {
+            errorMsg.getErrors().add(ve.getMessage());
+        }
+    }
+}

+ 33 - 0
info_api/async-validation/src/main/java/xgs/net/validation/impl/Ipv4Validation.java

@@ -0,0 +1,33 @@
+package xgs.net.validation.impl;
+
+import com.jfinal.plugin.activerecord.Model;
+import xgs.net.validation.annotation.Validation;
+import xgs.net.validation.entity.FieldEntity;
+import xgs.net.validation.entity.ModelEntity;
+import xgs.net.validation.entity.ValidationEntity;
+import xgs.net.validation.entity.ValidationErrorMsg;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+@Validation("ipv4")
+public class Ipv4Validation extends AbstractValidation
+{
+    private static final String regex = "^(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$";
+    private static final Pattern pattern;
+    
+    @Override
+    public void executor(final ModelEntity me, final FieldEntity fe, final ValidationEntity ve, final Model model, final ValidationErrorMsg errorMsg) {
+        if (model.get(fe.getField()) == null) {
+            return;
+        }
+        final Matcher matcher = Ipv4Validation.pattern.matcher(this.getStr(model, fe).toLowerCase());
+        if (!matcher.find()) {
+            errorMsg.getErrors().add(ve.getMessage());
+        }
+    }
+    
+    static {
+        pattern = Pattern.compile("^(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$");
+    }
+}

+ 37 - 0
info_api/async-validation/src/main/java/xgs/net/validation/impl/MobileValidation.java

@@ -0,0 +1,37 @@
+package xgs.net.validation.impl;
+
+import com.jfinal.plugin.activerecord.Model;
+import xgs.net.validation.annotation.Validation;
+import xgs.net.validation.entity.FieldEntity;
+import xgs.net.validation.entity.ModelEntity;
+import xgs.net.validation.entity.ValidationEntity;
+import xgs.net.validation.entity.ValidationErrorMsg;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+@Validation("mobile")
+public class MobileValidation extends AbstractValidation
+{
+    private static final String regex = "^((13[0-9])|(14[5,7])|(15[^4,\\\\D])|(17[0,1,3,6-8])|(18[0-9])|(19[8,9])|(166))[0-9]{8}$";
+    private static final Pattern pattern;
+    
+    @Override
+    public void executor(final ModelEntity me, final FieldEntity fe, final ValidationEntity ve, final Model model, final ValidationErrorMsg errorMsg) {
+        if (model.get(fe.getField()) == null) {
+            return;
+        }
+        if (!ve.getMobile()) {
+            return;
+        }
+        final String value = this.getStr(model, fe);
+        final Matcher matcher = MobileValidation.pattern.matcher(value);
+        if (!matcher.find()) {
+            errorMsg.getErrors().add(ve.getMessage());
+        }
+    }
+    
+    static {
+        pattern = Pattern.compile("^((13[0-9])|(14[5,7])|(15[^4,\\\\D])|(17[0,1,3,6-8])|(18[0-9])|(19[8,9])|(166))[0-9]{8}$");
+    }
+}

+ 28 - 0
info_api/async-validation/src/main/java/xgs/net/validation/impl/NumberValidation.java

@@ -0,0 +1,28 @@
+package xgs.net.validation.impl;
+
+import com.jfinal.plugin.activerecord.Model;
+import xgs.net.validation.annotation.Validation;
+import xgs.net.validation.entity.FieldEntity;
+import xgs.net.validation.entity.ModelEntity;
+import xgs.net.validation.entity.ValidationEntity;
+import xgs.net.validation.entity.ValidationErrorMsg;
+
+import java.math.BigDecimal;
+import java.math.BigInteger;
+
+@Validation("number")
+public class NumberValidation extends AbstractValidation
+{
+    @Override
+    public void executor(final ModelEntity me, final FieldEntity fe, final ValidationEntity ve, final Model model, final ValidationErrorMsg errorMsg) {
+        if (model.get(fe.getField()) == null) {
+            return;
+        }
+        final String field = fe.getField();
+        final Object _obj = model.get(field);
+        if (_obj instanceof BigDecimal || _obj instanceof Float || _obj instanceof Double || _obj instanceof Integer || _obj instanceof Long || _obj instanceof BigInteger) {
+            return;
+        }
+        errorMsg.getErrors().add(ve.getMessage());
+    }
+}

+ 30 - 0
info_api/async-validation/src/main/java/xgs/net/validation/impl/RequiredValidate.java

@@ -0,0 +1,30 @@
+package xgs.net.validation.impl;
+
+import com.jfinal.plugin.activerecord.Model;
+import xgs.net.validation.annotation.Validation;
+import xgs.net.validation.entity.FieldEntity;
+import xgs.net.validation.entity.ModelEntity;
+import xgs.net.validation.entity.ValidationEntity;
+import xgs.net.validation.entity.ValidationErrorMsg;
+
+@Validation("required")
+public class RequiredValidate extends AbstractValidation
+{
+    @Override
+    public void executor(final ModelEntity me, final FieldEntity fe, final ValidationEntity ve, final Model model, final ValidationErrorMsg errorMsg) {
+        if (!ve.getRequired()) {
+            return;
+        }
+        final Object value = model.get(fe.getField());
+        String val = null;
+        if (!(value instanceof String)) {
+            val = String.valueOf(model.get(fe.getField()));
+        }
+        else {
+            val = (String)value;
+        }
+        if (val == null || val.trim() == "" || val == "null") {
+            errorMsg.getErrors().add(ve.getMessage());
+        }
+    }
+}

+ 34 - 0
info_api/async-validation/src/main/java/xgs/net/validation/impl/StringValidate.java

@@ -0,0 +1,34 @@
+package xgs.net.validation.impl;
+
+import com.jfinal.plugin.activerecord.Model;
+import xgs.net.validation.annotation.Validation;
+import xgs.net.validation.entity.FieldEntity;
+import xgs.net.validation.entity.ModelEntity;
+import xgs.net.validation.entity.ValidationEntity;
+import xgs.net.validation.entity.ValidationErrorMsg;
+
+@Validation("string")
+public class StringValidate extends AbstractValidation
+{
+    @Override
+    public void executor(final ModelEntity me, final FieldEntity fe, final ValidationEntity ve, final Model model, final ValidationErrorMsg errorMsg) {
+        try {
+            final String value = model.getStr(fe.getField());
+            if (value == null || value.length() == 0) {
+                return;
+            }
+            if (ve.getMax() != null && value.length() > ve.getMax()) {
+                errorMsg.getErrors().add(ve.getMessage());
+            }
+            else if (ve.getMin() != null && value.length() < ve.getMin()) {
+                errorMsg.getErrors().add(ve.getMessage());
+            }
+            else if (ve.getLen() != null && value.length() != ve.getLen()) {
+                errorMsg.getErrors().add(ve.getMessage());
+            }
+        }
+        catch (Exception e) {
+            errorMsg.getErrors().add(ve.getMessage());
+        }
+    }
+}

+ 33 - 0
info_api/async-validation/src/main/java/xgs/net/validation/impl/UrlValidation.java

@@ -0,0 +1,33 @@
+package xgs.net.validation.impl;
+
+import com.jfinal.plugin.activerecord.Model;
+import xgs.net.validation.annotation.Validation;
+import xgs.net.validation.entity.FieldEntity;
+import xgs.net.validation.entity.ModelEntity;
+import xgs.net.validation.entity.ValidationEntity;
+import xgs.net.validation.entity.ValidationErrorMsg;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+@Validation("url")
+public class UrlValidation extends AbstractValidation
+{
+    private static final String regex = "http(s)?://([\\w-]+\\.)+[\\w-]+(/[\\w- ./?%&=]*)?";
+    private static final Pattern pattern;
+    
+    @Override
+    public void executor(ModelEntity me, FieldEntity fe, ValidationEntity ve, Model model, ValidationErrorMsg errorMsg) {
+        if (model.get(fe.getField()) == null) {
+            return;
+        }
+        final Matcher matcher = UrlValidation.pattern.matcher(this.getStr(model, fe).toLowerCase());
+        if (!matcher.find()) {
+            errorMsg.getErrors().add(ve.getMessage());
+        }
+    }
+    
+    static {
+        pattern = Pattern.compile("http(s)?://([\\w-]+\\.)+[\\w-]+(/[\\w- ./?%&=]*)?");
+    }
+}

+ 23 - 0
info_api/async-validation/src/main/java/xgs/net/validation/utils/ValidatePool.java

@@ -0,0 +1,23 @@
+package xgs.net.validation.utils;
+
+import xgs.net.validation.XgsValidation;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+public class ValidatePool
+{
+    private static Map<String, XgsValidation> pools;
+    
+    public static void init(final String name, final XgsValidation xv) {
+        ValidatePool.pools.put(name, xv);
+    }
+    
+    public static XgsValidation get(final String name) {
+        return ValidatePool.pools.get(name);
+    }
+    
+    static {
+        ValidatePool.pools = new ConcurrentHashMap<String, XgsValidation>();
+    }
+}

+ 105 - 0
info_api/core/pom.xml

@@ -0,0 +1,105 @@
+<?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>vipp</artifactId>
+        <groupId>xgs.net</groupId>
+        <version>1.0</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>core</artifactId>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.jfinal</groupId>
+            <artifactId>jfinal</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-classic</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-access</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>javax.servlet</groupId>
+            <artifactId>javax.servlet-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>commons-lang</groupId>
+            <artifactId>commons-lang</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>druid</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>xgs.net</groupId>
+            <artifactId>utils</artifactId>
+            <version>1.0</version>
+        </dependency>
+        <dependency>
+            <groupId>xgs.net</groupId>
+            <artifactId>ioc</artifactId>
+            <version>1.0</version>
+        </dependency>
+        <dependency>
+            <groupId>xgs.net</groupId>
+            <artifactId>entity</artifactId>
+            <version>1.0</version>
+        </dependency>
+        <dependency>
+            <groupId>xgs.net</groupId>
+            <artifactId>async-validation</artifactId>
+            <version>1.0</version>
+        </dependency>
+        <dependency>
+            <groupId>de.ruedigermoeller</groupId>
+            <artifactId>fst</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.solr</groupId>
+            <artifactId>solr-solrj</artifactId>
+        </dependency>
+    </dependencies>
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-jar-plugin</artifactId>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-dependency-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>copy</id>
+                        <phase>install</phase>
+                        <goals>
+                            <goal>copy-dependencies</goal>
+                        </goals>
+                        <configuration>
+                            <outputDirectory>${project.build.directory}/lib/</outputDirectory>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+</project>

+ 13 - 0
info_api/core/src/main/java/xgs/net/PropUtils.java

@@ -0,0 +1,13 @@
+package xgs.net;
+
+import com.jfinal.kit.Prop;
+import com.jfinal.kit.PropKit;
+
+public class PropUtils
+{
+    public static final Prop error;
+    
+    static {
+        error = PropKit.use("error.properties");
+    }
+}

+ 7 - 0
info_api/core/src/main/java/xgs/net/Test.java

@@ -0,0 +1,7 @@
+package xgs.net;
+
+public class Test
+{
+    public static void main(final String[] args) {
+    }
+}

+ 44 - 0
info_api/core/src/main/java/xgs/net/commons/GeneratorBean.java

@@ -0,0 +1,44 @@
+package xgs.net.commons;
+
+import com.jfinal.kit.PathKit;
+import com.jfinal.kit.Prop;
+import com.jfinal.kit.PropKit;
+import com.jfinal.plugin.activerecord.dialect.MysqlDialect;
+import com.jfinal.plugin.activerecord.generator.BaseModelGenerator;
+import com.jfinal.plugin.activerecord.generator.DataDictionaryGenerator;
+import com.jfinal.plugin.activerecord.generator.Generator;
+import com.jfinal.plugin.druid.DruidPlugin;
+import xgs.net.generator.MdDataDictionaryGenerator;
+import xgs.net.generator.XgsModelGenerator;
+
+import javax.sql.DataSource;
+
+public class GeneratorBean
+{
+    public static DataSource getDataSource() {
+        final Prop p = PropKit.use("jdbc.properties");
+        final DruidPlugin druidPlugin = new DruidPlugin(p.get("jdbc.mysql.uri"), p.get("jdbc.mysql.user"), p.get("jdbc.mysql.password"));
+        druidPlugin.setConnectionProperties("useInformationSchema=true;remarks=true");
+        druidPlugin.start();
+        return druidPlugin.getDataSource();
+    }
+    
+    public static void main(final String[] args) {
+        final String baseModelPackageName = "xgs.net.model.base";
+        final String baseModelOutputDir = PathKit.getWebRootPath() + "../../entity/src/main/java/xgs/net/model/base";
+        final String modelPackageName = "xgs.net.model";
+        final String modelOutputDir = baseModelOutputDir + "/..";
+        final DataSource dataSource = getDataSource();
+        final XgsModelGenerator modelGenerator = new XgsModelGenerator(modelPackageName, baseModelPackageName, modelOutputDir);
+        final BaseModelGenerator baseModelGenerator = new BaseModelGenerator(baseModelPackageName, baseModelOutputDir);
+        final Generator generator = new Generator(dataSource, baseModelGenerator, modelGenerator);
+        generator.setDialect(new MysqlDialect());
+        generator.addExcludedTable("adv");
+        generator.setGenerateDaoInModel(true);
+        final DataDictionaryGenerator dg = new MdDataDictionaryGenerator(dataSource, modelOutputDir);
+        dg.setDataDictionaryFileName("\u6570\u636e\u5b57\u5178.md");
+        generator.setDataDictionaryGenerator(dg);
+        generator.setGenerateDataDictionary(true);
+        generator.generate();
+    }
+}

+ 8 - 0
info_api/core/src/main/java/xgs/net/commons/XgsController.java

@@ -0,0 +1,8 @@
+package xgs.net.commons;
+
+import com.jfinal.core.Controller;
+
+public interface XgsController
+{
+    void exec(final Controller p0);
+}

+ 77 - 0
info_api/core/src/main/java/xgs/net/controller/BaseController.java

@@ -0,0 +1,77 @@
+package xgs.net.controller;
+
+import com.jfinal.core.Controller;
+import com.jfinal.plugin.redis.Cache;
+import com.jfinal.plugin.redis.Redis;
+import xgs.net.entity.Msg;
+import xgs.net.entity.OperaterEntity;
+import xgs.net.entity.PageEntity;
+import xgs.net.interceptors.ValidationInterceptor;
+//import xgs.net.model.TbUser;
+//import xgs.net.model.TbUser;
+import xgs.net.token.JwtToken;
+import xgs.net.utils.WebUtils;
+
+public class BaseController extends Controller
+{
+    private static final String memberSession = "group";
+    private static final int expire = 7*60*60*24;
+    private static Cache redis;
+
+    
+    protected String generateKey(final String JwtToken) {
+        return memberSession + "-" + JwtToken;
+    }
+    
+//    protected void cacheToken(final String JwtToken, final TbUser user) {
+//        BaseController.redis.setex(this.generateKey(JwtToken), expire, user);
+//    }
+    
+    protected PageEntity getPage() {
+        PageEntity entity = new PageEntity();
+        entity.setPageNo(this.getParaToInt("pageNumber", 1));
+        entity.setPageSize(this.getParaToInt("pageSize", 10));
+        return entity;
+    }
+//
+//    public TbUser getUser() {
+//        String token = this.getRequest().getHeader(ValidationInterceptor.XToken);
+//        String key = this.generateKey(token);
+//        TbUser member = BaseController.redis.get(this.generateKey(token));
+//        if (member != null) {
+//            BaseController.redis.expire(key, expire);
+//        }
+//        return member;
+//    }
+
+    
+    protected void renderMyJson(Msg msg) {
+        this.renderJson(msg);
+    }
+    
+//    protected OperaterEntity getOperaterEntity() {
+//        final OperaterEntity operaterEntity = new OperaterEntity();
+//        operaterEntity.setOperateTime(System.currentTimeMillis());
+//        operaterEntity.setOperateIp(WebUtils.getIP(this.getRequest()));
+//        operaterEntity.setOperator(this.getUser().getUserNick());
+//        operaterEntity.setOperatorId(this.getUser().getId());
+//        return operaterEntity;
+//    }
+//
+//    protected Msg setToken(final TbUser member) {
+//        final String token = JwtToken.createToken(member.getId());
+//        this.cacheToken(token, member);
+//        member.put(ValidationInterceptor.XToken, token);
+//        final Msg msg = new Msg();
+//        member.setSalt(null);
+//        member.setPwd(null);
+//        member.setStatus(null);
+//        member.removeNullValueAttrs();
+//        msg.setData(member);
+//        return msg;
+//    }
+    
+    static {
+        BaseController.redis = Redis.use();
+    }
+}

+ 23 - 0
info_api/core/src/main/java/xgs/net/entity/BaiduLocation.java

@@ -0,0 +1,23 @@
+package xgs.net.entity;
+
+public class BaiduLocation {
+
+    private String lng;
+    private String lat;
+
+    public String getLng() {
+        return lng;
+    }
+
+    public void setLng(String lng) {
+        this.lng = lng;
+    }
+
+    public String getLat() {
+        return lat;
+    }
+
+    public void setLat(String lat) {
+        this.lat = lat;
+    }
+}

+ 63 - 0
info_api/core/src/main/java/xgs/net/entity/LocationEntity.java

@@ -0,0 +1,63 @@
+package xgs.net.entity;
+
+import java.math.BigDecimal;
+
+public class LocationEntity {
+    private int cityCode;
+    private String adcode;
+    private String text;
+    private Location location;
+
+    public int getCityCode() {
+        return cityCode;
+    }
+
+    public void setCityCode(int cityCode) {
+        this.cityCode = cityCode;
+    }
+
+    public String getAdcode() {
+        return adcode;
+    }
+
+    public void setAdcode(String adcode) {
+        this.adcode = adcode;
+    }
+
+    public Location getLocation() {
+        return location;
+    }
+
+    public void setLocation(Location location) {
+        this.location = location;
+    }
+
+    public String getText() {
+        return text;
+    }
+
+    public void setText(String text) {
+        this.text = text;
+    }
+
+    public class Location {
+        private BigDecimal lng;
+        private BigDecimal lat;
+
+        public BigDecimal getLng() {
+            return lng;
+        }
+
+        public void setLng(BigDecimal lng) {
+            this.lng = lng;
+        }
+
+        public BigDecimal getLat() {
+            return lat;
+        }
+
+        public void setLat(BigDecimal lat) {
+            this.lat = lat;
+        }
+    }
+}

+ 36 - 0
info_api/core/src/main/java/xgs/net/entity/Msg.java

@@ -0,0 +1,36 @@
+package xgs.net.entity;
+
+public class Msg
+{
+    private int code;
+    private String msg;
+    private Object data;
+    
+    public Msg() {
+        this.code = 200;
+    }
+    
+    public int getCode() {
+        return this.code;
+    }
+    
+    public void setCode(final int code) {
+        this.code = code;
+    }
+    
+    public String getMsg() {
+        return this.msg;
+    }
+    
+    public void setMsg(final String msg) {
+        this.msg = msg;
+    }
+    
+    public Object getData() {
+        return this.data;
+    }
+    
+    public void setData(final Object data) {
+        this.data = data;
+    }
+}

+ 37 - 0
info_api/core/src/main/java/xgs/net/entity/PageEntity.java

@@ -0,0 +1,37 @@
+package xgs.net.entity;
+
+public class PageEntity
+{
+    private int pageNo;
+    private int pageSize;
+    private int offset;
+    
+    public PageEntity() {
+        this.pageNo = 1;
+        this.pageSize = 10;
+    }
+    
+    public int getPageNo() {
+        return this.pageNo;
+    }
+    
+    public void setPageNo(final int pageNo) {
+        this.pageNo = pageNo;
+    }
+    
+    public int getPageSize() {
+        return this.pageSize;
+    }
+    
+    public void setPageSize(final int pageSize) {
+        this.pageSize = pageSize;
+    }
+    
+    public void setOffset(final int offset) {
+        this.offset = offset;
+    }
+    
+    public int getOffset() {
+        return (this.pageNo - 1) * this.pageSize;
+    }
+}

+ 22 - 0
info_api/core/src/main/java/xgs/net/handle/RenderingTimeHandler.java

@@ -0,0 +1,22 @@
+package xgs.net.handle;
+
+import com.jfinal.handler.Handler;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+public class RenderingTimeHandler extends Handler
+{
+    protected final Logger log  = LoggerFactory.getLogger(this.getClass());
+
+    
+    public void handle(final String target, final HttpServletRequest request, final HttpServletResponse response, final boolean[] isHandled) {
+        final long start = System.currentTimeMillis();
+        final String userAgent = request.getHeader("User-Agent");
+        this.next.handle(target, request, response, isHandled);
+        final long end = System.currentTimeMillis();
+        this.log.info("User-Agent:[" + userAgent + "]\tURL:[" + target + "]\tTRENDING TIME:\t[" + (end - start) + "]ms");
+    }
+}

+ 15 - 0
info_api/core/src/main/java/xgs/net/handle/SessionHandler.java

@@ -0,0 +1,15 @@
+package xgs.net.handle;
+
+import com.jfinal.handler.Handler;
+import xgs.net.session.SessionRepositoryRequestWrapper;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+public class SessionHandler extends Handler
+{
+    public void handle(final String target, HttpServletRequest request, final HttpServletResponse response, final boolean[] isHandled) {
+        request = new SessionRepositoryRequestWrapper(request, response);
+        this.next.handle(target, request, response, isHandled);
+    }
+}

+ 27 - 0
info_api/core/src/main/java/xgs/net/handle/Uri404Handle.java

@@ -0,0 +1,27 @@
+package xgs.net.handle;
+
+import com.jfinal.core.Action;
+import com.jfinal.core.JFinal;
+import com.jfinal.handler.Handler;
+import com.jfinal.render.RenderManager;
+import xgs.net.entity.Msg;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+public class Uri404Handle extends Handler
+{
+    public void handle(final String target, final HttpServletRequest request, final HttpServletResponse response, final boolean[] isHandled) {
+        final String[] urlPara = { null };
+        final Action action = JFinal.me().getAction(target, urlPara);
+        if (action == null) {
+            Msg msg = new Msg();
+            msg.setCode(404);
+            msg.setMsg("\u627e\u4e0d\u5230\u8def\u5f84");
+            RenderManager.me().getRenderFactory().getJsonRender(msg).setContext(request, response).render();
+            isHandled[0] = true;
+            return;
+        }
+        this.next.handle(target, request, response, isHandled);
+    }
+}

+ 15 - 0
info_api/core/src/main/java/xgs/net/init/InitDb.java

@@ -0,0 +1,15 @@
+package xgs.net.init;
+
+import com.jfinal.kit.Prop;
+import com.jfinal.kit.PropKit;
+import com.jfinal.plugin.activerecord.dialect.Dialect;
+import com.jfinal.plugin.druid.DruidPlugin;
+
+public interface InitDb
+{
+    public static final Prop prop = PropKit.use("jdbc.properties");
+    
+    DruidPlugin init();
+    
+    Dialect getDialect();
+}

+ 28 - 0
info_api/core/src/main/java/xgs/net/init/MysqlDb.java

@@ -0,0 +1,28 @@
+package xgs.net.init;
+
+import com.alibaba.druid.filter.logging.Slf4jLogFilter;
+import com.alibaba.druid.filter.stat.StatFilter;
+import com.alibaba.druid.wall.WallFilter;
+import com.jfinal.plugin.activerecord.dialect.Dialect;
+import com.jfinal.plugin.activerecord.dialect.MysqlDialect;
+import com.jfinal.plugin.druid.DruidPlugin;
+
+public class MysqlDb implements InitDb
+{
+    @Override
+    public DruidPlugin init() {
+        final DruidPlugin druidPlugin = new DruidPlugin(MysqlDb.prop.get("jdbc.mysql.url"), MysqlDb.prop.get("jdbc.mysql.user"), MysqlDb.prop.get("jdbc.mysql.password"));
+        druidPlugin.setValidationQuery(MysqlDb.prop.get("jdbc.mysql.validation_query"));
+        druidPlugin.addFilter(new StatFilter());
+        final WallFilter wall = new WallFilter();
+        wall.setDbType("mysql");
+        druidPlugin.addFilter(wall);
+        druidPlugin.addFilter(new Slf4jLogFilter());
+        return druidPlugin;
+    }
+    
+    @Override
+    public Dialect getDialect() {
+        return new MysqlDialect();
+    }
+}

+ 28 - 0
info_api/core/src/main/java/xgs/net/init/PostgresDb.java

@@ -0,0 +1,28 @@
+package xgs.net.init;
+
+import com.alibaba.druid.filter.logging.Slf4jLogFilter;
+import com.alibaba.druid.filter.stat.StatFilter;
+import com.alibaba.druid.wall.WallFilter;
+import com.jfinal.plugin.activerecord.dialect.Dialect;
+import com.jfinal.plugin.activerecord.dialect.PostgreSqlDialect;
+import com.jfinal.plugin.druid.DruidPlugin;
+
+public class PostgresDb implements InitDb
+{
+    @Override
+    public DruidPlugin init() {
+        final DruidPlugin druidPlugin = new DruidPlugin(PostgresDb.prop.get("jdbc.postgres.uri"), PostgresDb.prop.get("jdbc.postgres.user"), PostgresDb.prop.get("jdbc.postgres.password"));
+        druidPlugin.setValidationQuery(PostgresDb.prop.get("jdbc.postgres.validation_query"));
+        druidPlugin.addFilter(new StatFilter());
+        final WallFilter wall = new WallFilter();
+        wall.setDbType("postgresql");
+        druidPlugin.addFilter(wall);
+        druidPlugin.addFilter(new Slf4jLogFilter());
+        return druidPlugin;
+    }
+    
+    @Override
+    public Dialect getDialect() {
+        return new PostgreSqlDialect();
+    }
+}

+ 95 - 0
info_api/core/src/main/java/xgs/net/init/XgsConfig.java

@@ -0,0 +1,95 @@
+package xgs.net.init;
+
+import org.slf4j.*;
+import com.jfinal.json.*;
+import xgs.net.logs.*;
+import com.jfinal.log.*;
+import com.jfinal.template.*;
+import com.jfinal.plugin.*;
+import com.jfinal.plugin.activerecord.*;
+import xgs.net.model.*;
+import com.jfinal.plugin.redis.*;
+import com.jfinal.config.*;
+import com.jfinal.handler.*;
+import com.jfinal.plugin.druid.*;
+import xgs.net.session.*;
+import xgs.net.handle.*;
+import com.jfinal.kit.*;
+
+public abstract class XgsConfig extends JFinalConfig
+{
+    private Logger logger = LoggerFactory.getLogger(this.getClass());
+    protected Routes routes;
+    public static Prop prop;
+
+
+    public void configConstant(final Constants me) {
+        me.setDevMode(XgsConfig.prop.getBoolean("system.dev", false));
+        me.setJsonFactory(new MixedJsonFactory());
+        me.setLogFactory(new SLF4JLogFactory());
+        PathKit.setWebRootPath("/aa");
+        this.constant(me);
+    }
+
+    public abstract void constant(final Constants p0);
+
+    public void configRoute(final Routes me) {
+        this.routes = me;
+        this.logger.debug("init routes");
+    }
+
+    public void configEngine(final Engine me) {
+        System.err.println("\u8fdb\u5165configEngine:>>>" + me.getBaseTemplatePath());
+    }
+
+    public void configPlugin(final Plugins me) {
+        this.logger.debug("init plugins");
+        try {
+            this.logger.debug("init database..");
+            final InitDb db = (InitDb)Class.forName(XgsConfig.prop.get("system.db")).newInstance();
+            final DruidPlugin druidPlugin = db.init();
+            druidPlugin.setMaxPoolPreparedStatementPerConnectionSize(InitDb.prop.getInt("jdbc.min_poll", 10));
+            druidPlugin.setMaxActive(InitDb.prop.getInt("jdbc.max_poll", 100));
+            me.add(druidPlugin);
+            final ActiveRecordPlugin arp = new ActiveRecordPlugin(druidPlugin);
+            arp.setShowSql(InitDb.prop.getBoolean("jdbc.show_sql", false));
+            arp.setContainerFactory(new CaseInsensitiveContainerFactory(true));
+            arp.setDialect(db.getDialect());
+            _MappingKit.mapping(arp);
+            me.add(arp);
+            if (XgsConfig.prop.getBoolean("cache.enable", false)) {
+                me.add(new RedisPlugin(XgsConfig.prop.get("cache.redis.wx.name"), XgsConfig.prop.get("cache.redis.host"), XgsConfig.prop.getInt("cache.redis.port")));
+            }
+            this.logger.debug("inited database..");
+        }
+        catch (Exception e) {
+            this.logger.error(e.getMessage());
+            e.printStackTrace();
+        }
+        this.plugin(me);
+    }
+
+    public abstract void plugin(final Plugins p0);
+
+    public void configInterceptor(final Interceptors me) {
+        this.interceptor(me);
+    }
+
+    public abstract void interceptor(final Interceptors p0);
+
+    public void configHandler(final Handlers me) {
+        me.add(new RenderingTimeHandler());
+        me.add(new DruidStatViewHandler("/druid"));
+        if (XgsConfig.prop.getBoolean("session.enable", false)) {
+            SessionRepositoryRequestWrapper.initCfg(XgsConfig.prop.get("session.domain"), XgsConfig.prop.getInt("session.maxAgeInSeconds"), XgsConfig.prop.get("session.id"), XgsConfig.prop.get("session.cache"));
+            me.add(new SessionHandler());
+        }
+        this.handler(me);
+    }
+
+    public abstract void handler(final Handlers p0);
+
+    static {
+        XgsConfig.prop = PropKit.use("cfg.properties");
+    }
+}

+ 30 - 0
info_api/core/src/main/java/xgs/net/interceptors/AcademyInterceptor.java

@@ -0,0 +1,30 @@
+package xgs.net.interceptors;
+
+import com.jfinal.aop.Interceptor;
+import com.jfinal.aop.Invocation;
+import xgs.net.controller.BaseController;
+import xgs.net.entity.Msg;
+//import xgs.net.model.TbUser;
+import xgs.net.token.JwtToken;
+
+//import xgs.net.model.TbUser;
+
+public class AcademyInterceptor implements Interceptor
+{
+    public static final String XToken = "x-token";
+
+    
+    public void intercept(Invocation inv) {
+        BaseController controller = (BaseController)inv.getController();
+        String token = controller.getRequest().getHeader(XToken);
+//        TbUser user = controller.getUser();
+//        if (user.get("academy")) {
+//            inv.invoke();
+//        } else {
+            Msg msg = new Msg();
+            msg.setCode(848);
+            msg.setMsg("\u4f60\u8fd8\u4e0d\u662f\u6821\u53cb\u6682\u65f6\u65e0\u6743\u64cd\u4f5c\u0021\u8bf7\u5b8c\u5584\u6821\u53cb\u4fe1\u606f\u540e\u518d\u8bd5\uff01");
+            controller.renderJson(msg);
+//        }
+    }
+}

+ 23 - 0
info_api/core/src/main/java/xgs/net/interceptors/DomainInterceptor.java

@@ -0,0 +1,23 @@
+package xgs.net.interceptors;
+
+import com.jfinal.aop.Interceptor;
+import com.jfinal.aop.Invocation;
+import com.jfinal.core.Controller;
+import xgs.net.entity.Msg;
+
+public class DomainInterceptor implements Interceptor
+{
+    public void intercept(final Invocation inv) {
+        Controller controller = inv.getTarget();
+        controller.getResponse().addHeader("Access-Control-Allow-Headers", "X-Requested-With,X_Requested_With,Content-Type,Access-Token,x-token,x-location");
+        controller.getResponse().addHeader("Access-Control-Allow-Origin", "*");
+        controller.getResponse().addHeader("Access-Control-Allow-Credentials", "true");
+        controller.getResponse().addHeader("Access-Control-Allow-Methods", "*");
+        controller.getResponse().addHeader("Access-Control-Expose-Headers", "*");
+        if (controller.getRequest().getMethod().equalsIgnoreCase("OPTIONS")) {
+            controller.renderJson(new Msg());
+            return;
+        }
+        inv.invoke();
+    }
+}

+ 14 - 0
info_api/core/src/main/java/xgs/net/interceptors/InjectInterceptor.java

@@ -0,0 +1,14 @@
+package xgs.net.interceptors;
+
+import com.jfinal.aop.Interceptor;
+import com.jfinal.aop.Invocation;
+import xgs.net.plugin.ioc.InjectUtils;
+
+public class InjectInterceptor implements Interceptor
+{
+    public void intercept(final Invocation inv) {
+        Object target = inv.getTarget();
+        InjectUtils.inject(target);
+        inv.invoke();
+    }
+}

+ 31 - 0
info_api/core/src/main/java/xgs/net/interceptors/JsonInterceptor.java

@@ -0,0 +1,31 @@
+package xgs.net.interceptors;
+
+import com.jfinal.aop.Interceptor;
+import com.jfinal.aop.Invocation;
+import com.jfinal.core.Controller;
+import xgs.net.entity.Msg;
+import xgs.net.exception.XgsException;
+
+public class JsonInterceptor implements Interceptor
+{
+    public void intercept(Invocation inv) {
+        try {
+            inv.invoke();
+        }
+        catch (Exception e) {
+            final Controller controller = inv.getController();
+            e.printStackTrace();
+            final Msg msg = new Msg();
+            if (e instanceof XgsException) {
+                int code = ((XgsException)e).getCode();
+                msg.setCode(code);
+                msg.setMsg(e.getMessage());
+            }
+            else {
+                msg.setCode(500);
+                msg.setMsg("\u7cfb\u7edf\u9519\u8bef");
+            }
+            controller.renderJson(msg);
+        }
+    }
+}

+ 72 - 0
info_api/core/src/main/java/xgs/net/interceptors/LogInterceptor.java

@@ -0,0 +1,72 @@
+package xgs.net.interceptors;
+
+import com.jfinal.aop.Interceptor;
+import com.jfinal.aop.Invocation;
+import com.jfinal.core.Controller;
+import com.jfinal.kit.JsonKit;
+import org.apache.commons.lang.exception.ExceptionUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import xgs.net.annotation.Log;
+
+import java.lang.reflect.Parameter;
+import java.util.HashMap;
+import java.util.Map;
+
+public class LogInterceptor implements Interceptor
+{
+    Logger logger = LoggerFactory.getLogger((Class)this.getClass());
+
+    
+    public void intercept(final Invocation inv) {
+        try {
+            inv.invoke();
+            this.print(inv);
+        }
+        catch (Exception e) {
+            this.print(inv, e);
+            throw e;
+        }
+    }
+    
+    private void print(final Invocation inv, final Throwable ex) {
+        new Thread(() -> {
+            HashMap<String, String> map;
+            Object args2;
+            Parameter[] parameters;
+            String keyWord;
+            int i;
+            Log log = inv.getMethod().getAnnotation(Log.class);
+            if (log != null) {
+                Object args = null;
+                if (inv.getTarget() instanceof Controller) {
+                    args2 = inv.getController().getRequest().getParameterMap();
+                }
+                else {
+                    parameters = inv.getMethod().getParameters();
+                    args2 = new HashMap();
+                    for (i = 0; i < parameters.length; ++i) {
+                        ((Map)args2).put(parameters[i].getName(), inv.getArg(i));
+                    }
+                }
+                keyWord = log.value();
+                if (log.value().isEmpty()) {
+                    keyWord = inv.getTarget().getClass().getSimpleName() + " > " + inv.getMethodName();
+                }
+                map = new HashMap<>();
+                map.put("className", inv.getTarget().getClass().getName());
+                map.put("methodName", inv.getMethodName());
+                map.put("keyword", keyWord);
+                map.put("args", (String)args2);
+                if (ex != null) {
+                    map.put("exception", ExceptionUtils.getFullStackTrace(ex));
+                }
+                this.logger.info(JsonKit.toJson(map));
+            }
+        }).start();
+    }
+    
+    private void print(Invocation inv) {
+        this.print(inv, null);
+    }
+}

+ 26 - 0
info_api/core/src/main/java/xgs/net/interceptors/RestFulInterceptor.java

@@ -0,0 +1,26 @@
+package xgs.net.interceptors;
+
+import com.jfinal.aop.Interceptor;
+import com.jfinal.aop.Invocation;
+import xgs.net.annotation.Method;
+import xgs.net.entity.Msg;
+
+public class RestFulInterceptor implements Interceptor
+{
+    public void intercept(Invocation inv) {
+        Method method = inv.getMethod().getAnnotation(Method.class);
+        if (method == null) {
+            inv.invoke();
+            return;
+        }
+        String reqMethod = inv.getController().getRequest().getMethod().toUpperCase();
+        if (!reqMethod.equals(method.value().name())) {
+            Msg msg = new Msg();
+            msg.setCode(405);
+            msg.setMsg("only allow " + method.value());
+            inv.getController().renderJson(msg);
+            return;
+        }
+        inv.invoke();
+    }
+}

+ 29 - 0
info_api/core/src/main/java/xgs/net/interceptors/ValidationInterceptor.java

@@ -0,0 +1,29 @@
+package xgs.net.interceptors;
+
+import com.jfinal.aop.Interceptor;
+import com.jfinal.aop.Invocation;
+import xgs.net.controller.BaseController;
+import xgs.net.entity.Msg;
+//import xgs.net.model.TbUser;
+//import xgs.net.model.TbUser;
+import xgs.net.token.JwtToken;
+
+public class ValidationInterceptor implements Interceptor
+{
+    public static final String XToken = "x-token";
+
+    
+    public void intercept(Invocation inv) {
+        BaseController controller = (BaseController)inv.getController();
+        String token = controller.getRequest().getHeader(XToken);
+//        TbUser user = controller.getUser();
+//        if (JwtToken.verify(token) && user != null && token.startsWith(String.valueOf(user.getId()))) {
+//            inv.invoke();
+//        } else {
+            Msg msg = new Msg();
+            msg.setCode(999);
+            msg.setMsg("\u767b\u9646\u4fe1\u606f\u5df2\u8fc7\u671f");
+            controller.renderJson(msg);
+//        }
+    }
+}

+ 64 - 0
info_api/core/src/main/java/xgs/net/logs/LogPrintStream.java

@@ -0,0 +1,64 @@
+package xgs.net.logs;
+
+import com.jfinal.log.Log;
+
+import java.io.PrintStream;
+import java.util.Locale;
+
+public class LogPrintStream extends PrintStream
+{
+    private final Log log;
+    private final boolean error;
+    
+    public LogPrintStream(boolean error) {
+        super(error ? System.err : System.out);
+        this.log = Log.getLog("System.out:");
+        this.error = error;
+    }
+    
+    @Override
+    public void print(String s) {
+        if (this.error) {
+            this.log.error(s);
+        }
+        else {
+            this.log.info(s);
+        }
+    }
+    
+    @Override
+    public void println() {
+    }
+    
+    @Override
+    public void println(String x) {
+        if (this.error) {
+            this.log.error(x);
+        }
+        else {
+            this.log.info(x);
+        }
+    }
+    
+    @Override
+    public PrintStream printf(String format, Object... args) {
+        if (this.error) {
+            this.log.error(String.format(format, args));
+        }
+        else {
+            this.log.info(String.format(format, args));
+        }
+        return this;
+    }
+    
+    @Override
+    public PrintStream printf(Locale l, String format, Object... args) {
+        if (this.error) {
+            this.log.error(String.format(l, format, args));
+        }
+        else {
+            this.log.info(String.format(l, format, args));
+        }
+        return this;
+    }
+}

+ 78 - 0
info_api/core/src/main/java/xgs/net/logs/SLF4JLog.java

@@ -0,0 +1,78 @@
+package xgs.net.logs;
+
+import com.jfinal.log.Log;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class SLF4JLog extends Log
+{
+    private Logger log;
+    
+    SLF4JLog(Class<?> clazz) {
+        this.log = LoggerFactory.getLogger((Class)clazz);
+    }
+    
+    SLF4JLog(String name) {
+        this.log = LoggerFactory.getLogger(name);
+    }
+    
+    public void info(String message) {
+        this.log.info(message);
+    }
+    
+    public void info(String message, Throwable t) {
+        this.log.info(message, t);
+    }
+    
+    public void debug(String message) {
+        this.log.debug(message);
+    }
+    
+    public void debug(String message, final Throwable t) {
+        this.log.debug(message, t);
+    }
+    
+    public void warn(String message) {
+        this.log.warn(message);
+    }
+    
+    public void warn(String message, Throwable t) {
+        this.log.warn(message, t);
+    }
+    
+    public void error(String message) {
+        this.log.error(message);
+    }
+    
+    public void error(String message, Throwable t) {
+        this.log.error(message, t);
+    }
+    
+    public void fatal(String message) {
+        this.log.error(message);
+    }
+    
+    public void fatal(String message, Throwable t) {
+        this.log.error(message, t);
+    }
+    
+    public boolean isDebugEnabled() {
+        return this.log.isDebugEnabled();
+    }
+    
+    public boolean isInfoEnabled() {
+        return this.log.isInfoEnabled();
+    }
+    
+    public boolean isWarnEnabled() {
+        return this.log.isWarnEnabled();
+    }
+    
+    public boolean isErrorEnabled() {
+        return this.log.isErrorEnabled();
+    }
+    
+    public boolean isFatalEnabled() {
+        return this.log.isErrorEnabled();
+    }
+}

+ 15 - 0
info_api/core/src/main/java/xgs/net/logs/SLF4JLogFactory.java

@@ -0,0 +1,15 @@
+package xgs.net.logs;
+
+import com.jfinal.log.ILogFactory;
+import com.jfinal.log.Log;
+
+public class SLF4JLogFactory implements ILogFactory
+{
+    public Log getLog(Class<?> clazz) {
+        return new SLF4JLog(clazz);
+    }
+    
+    public Log getLog(String name) {
+        return new SLF4JLog(name);
+    }
+}

+ 65 - 0
info_api/core/src/main/java/xgs/net/plugin/tips/RuanweiSMS.java

@@ -0,0 +1,65 @@
+package xgs.net.plugin.tips;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import xgs.net.plugin.tips.ruanwei.interfacej.SmsClientSend;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class RuanweiSMS implements TipsInterface
+{
+    Logger logger = LoggerFactory.getLogger(this.getClass());
+    private static final String url = "http://client.movek.net:8888/sms.aspx";
+    private static final String userid = "1004";
+    private static final String account = "SDK-A150-1004";
+    private static final String password = "336699";
+    
+
+    @Override
+    public void send(String target, String content) {
+        final async a = new async(target, content);
+        new Thread(a).start();
+    }
+    
+    @Override
+    public void send(List<String> target, String content) {
+        String mobiles = "";
+        for (String s : target) {
+            mobiles = mobiles + "," + s;
+        }
+        mobiles = mobiles.substring(1);
+        final async a = new async(mobiles, content);
+        new Thread(a).start();
+    }
+    
+    public static void main(String[] args) {
+        final List<String> str = new ArrayList<String>();
+        str.add("17361699191");
+        str.add("18606697159");
+        new RuanweiSMS().send(str, "【\u6211\u7684\u6d4b\u8bd5\u77ed\u4fe1】");
+    }
+    
+    class async implements Runnable
+    {
+        String content;
+        String mobiles;
+        
+        async(String mobiles, String content) {
+            this.mobiles = mobiles;
+            this.content = content;
+        }
+        
+        @Override
+        public void run() {
+            try {
+                RuanweiSMS.this.logger.debug(this.content);
+                final String ret = SmsClientSend.sendSms(url, userid, account, password, this.mobiles, this.content);
+                RuanweiSMS.this.logger.info(ret);
+            }
+            catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+    }
+}

+ 10 - 0
info_api/core/src/main/java/xgs/net/plugin/tips/TipsInterface.java

@@ -0,0 +1,10 @@
+package xgs.net.plugin.tips;
+
+import java.util.List;
+
+public interface TipsInterface
+{
+    void send(String p0, String p1);
+    
+    void send(List<String> p0, String p1);
+}

+ 28 - 0
info_api/core/src/main/java/xgs/net/plugin/tips/ruanwei/interfacej/SmsClientKeyword.java

@@ -0,0 +1,28 @@
+package xgs.net.plugin.tips.ruanwei.interfacej;
+
+import xgs.net.plugin.tips.ruanwei.tool.SmsClientAccessTool;
+
+import java.net.URLEncoder;
+
+public class SmsClientKeyword
+{
+    public static String queryKeyWord(final String url, final String userid, final String account, final String password, final String checkWord) {
+        try {
+            final StringBuffer sendParam = new StringBuffer();
+            sendParam.append("action=checkkeyword");
+            sendParam.append("&userid=").append(userid);
+            sendParam.append("&account=").append(URLEncoder.encode(account, "UTF-8"));
+            sendParam.append("&password=").append(URLEncoder.encode(password, "UTF-8"));
+            if (checkWord != null && !checkWord.equals("")) {
+                sendParam.append("&content=").append(URLEncoder.encode(checkWord, "UTF-8"));
+                System.out.println(sendParam);
+                return SmsClientAccessTool.getInstance().doAccessHTTPPost(url, sendParam.toString(), "UTF-8");
+            }
+            return "\u9700\u8981\u68c0\u67e5\u7684\u5b57\u7b26\u4e32\u4e0d\u80fd\u4e3a\u7a7a";
+        }
+        catch (Exception e) {
+            e.printStackTrace();
+            return "\u672a\u53d1\u9001\uff0c\u5f02\u5e38-->" + e.getMessage();
+        }
+    }
+}

+ 23 - 0
info_api/core/src/main/java/xgs/net/plugin/tips/ruanwei/interfacej/SmsClientOverage.java

@@ -0,0 +1,23 @@
+package xgs.net.plugin.tips.ruanwei.interfacej;
+
+import xgs.net.plugin.tips.ruanwei.tool.SmsClientAccessTool;
+
+import java.net.URLEncoder;
+
+public class SmsClientOverage
+{
+    public static String queryOverage(final String url, final String userid, final String account, final String password) {
+        try {
+            final StringBuffer sendParam = new StringBuffer();
+            sendParam.append("action=overage");
+            sendParam.append("&userid=").append(userid);
+            sendParam.append("&account=").append(URLEncoder.encode(account, "UTF-8"));
+            sendParam.append("&password=").append(URLEncoder.encode(password, "UTF-8"));
+            return SmsClientAccessTool.getInstance().doAccessHTTPPost(url, sendParam.toString(), "UTF-8");
+        }
+        catch (Exception e) {
+            e.printStackTrace();
+            return "\u672a\u53d1\u9001\uff0c\u5f02\u5e38-->" + e.getMessage();
+        }
+    }
+}

+ 23 - 0
info_api/core/src/main/java/xgs/net/plugin/tips/ruanwei/interfacej/SmsClientQueryCall.java

@@ -0,0 +1,23 @@
+package xgs.net.plugin.tips.ruanwei.interfacej;
+
+import xgs.net.plugin.tips.ruanwei.tool.SmsClientAccessTool;
+
+import java.net.URLEncoder;
+
+public class SmsClientQueryCall
+{
+    public static String queryStatusReport(final String url, final String userid, final String account, final String password) {
+        try {
+            final StringBuffer sendParam = new StringBuffer();
+            sendParam.append("action=query");
+            sendParam.append("&userid=").append(userid);
+            sendParam.append("&account=").append(URLEncoder.encode(account, "UTF-8"));
+            sendParam.append("&password=").append(URLEncoder.encode(password, "UTF-8"));
+            return SmsClientAccessTool.getInstance().doAccessHTTPPost(url, sendParam.toString(), "UTF-8");
+        }
+        catch (Exception e) {
+            e.printStackTrace();
+            return "\u672a\u53d1\u9001\uff0c\u5f02\u5e38-->" + e.getMessage();
+        }
+    }
+}

+ 23 - 0
info_api/core/src/main/java/xgs/net/plugin/tips/ruanwei/interfacej/SmsClientQueryStatusReport.java

@@ -0,0 +1,23 @@
+package xgs.net.plugin.tips.ruanwei.interfacej;
+
+import xgs.net.plugin.tips.ruanwei.tool.SmsClientAccessTool;
+
+import java.net.URLEncoder;
+
+public class SmsClientQueryStatusReport
+{
+    public static String queryStatusReport(final String url, final String userid, final String account, final String password) {
+        try {
+            final StringBuffer sendParam = new StringBuffer();
+            sendParam.append("action=query");
+            sendParam.append("&userid=").append(userid);
+            sendParam.append("&account=").append(URLEncoder.encode(account, "UTF-8"));
+            sendParam.append("&password=").append(URLEncoder.encode(password, "UTF-8"));
+            return SmsClientAccessTool.getInstance().doAccessHTTPPost(url, sendParam.toString(), "UTF-8");
+        }
+        catch (Exception e) {
+            e.printStackTrace();
+            return "\u672a\u53d1\u9001\uff0c\u5f02\u5e38-->" + e.getMessage();
+        }
+    }
+}

+ 61 - 0
info_api/core/src/main/java/xgs/net/plugin/tips/ruanwei/interfacej/SmsClientSend.java

@@ -0,0 +1,61 @@
+package xgs.net.plugin.tips.ruanwei.interfacej;
+
+import xgs.net.plugin.tips.ruanwei.tool.SmsClientAccessTool;
+
+import java.net.URLEncoder;
+
+public class SmsClientSend
+{
+    public static String sendSms(final String url, final String userid, final String account, final String password, final String mobile, final String content) {
+        return sendSms(url, userid, account, password, mobile, content, null, null, null, null, null, null, null, "POST", "UTF-8", "UTF-8");
+    }
+    
+    private static String sendSms(final String url, final String userid, final String account, final String password, final String mobile, final String content, final String action, final String sendTime, final String checkContent, final String taskName, final String countNumber, final String mobileNumber, final String telephoneNumber, final String sendType, String codingType, String backEncodType) {
+        try {
+            if (codingType == null || codingType.equals("")) {
+                codingType = "UTF-8";
+            }
+            if (backEncodType == null || backEncodType.equals("")) {
+                backEncodType = "UTF-8";
+            }
+            final StringBuffer send = new StringBuffer();
+            if (action != null && !action.equals("")) {
+                send.append("action=").append(action);
+            }
+            else {
+                send.append("action=send");
+            }
+            send.append("&userid=").append(userid);
+            send.append("&account=").append(URLEncoder.encode(account, codingType));
+            send.append("&password=").append(URLEncoder.encode(password, codingType));
+            send.append("&mobile=").append(mobile);
+            send.append("&content=").append(URLEncoder.encode(content, codingType));
+            if (sendTime != null && !sendTime.equals("")) {
+                send.append("&sendTime=").append(URLEncoder.encode(sendTime, codingType));
+            }
+            if (checkContent != null && !checkContent.equals("")) {
+                send.append("&checkContent=").append(checkContent);
+            }
+            if (taskName != null && !taskName.equals("")) {
+                send.append("&taskName=").append(URLEncoder.encode(taskName, codingType));
+            }
+            if (countNumber != null && !countNumber.equals("")) {
+                send.append("&countNumber=").append(countNumber);
+            }
+            if (mobileNumber != null && !mobileNumber.equals("")) {
+                send.append("&mobileNumber=").append(mobileNumber);
+            }
+            if (telephoneNumber != null && !telephoneNumber.equals("")) {
+                send.append("&telephoneNumber=").append(telephoneNumber);
+            }
+            if (sendType != null && sendType.toLowerCase().equals("get")) {
+                return SmsClientAccessTool.getInstance().doAccessHTTPGet(url + "?" + send.toString(), backEncodType);
+            }
+            return SmsClientAccessTool.getInstance().doAccessHTTPPost(url, send.toString(), backEncodType);
+        }
+        catch (Exception e) {
+            e.printStackTrace();
+            return "\u672a\u53d1\u9001\uff0c\u7f16\u7801\u5f02\u5e38";
+        }
+    }
+}

+ 99 - 0
info_api/core/src/main/java/xgs/net/plugin/tips/ruanwei/tool/SmsClientAccessTool.java

@@ -0,0 +1,99 @@
+package xgs.net.plugin.tips.ruanwei.tool;
+
+import java.io.*;
+import java.net.HttpURLConnection;
+import java.net.URL;
+
+public class SmsClientAccessTool
+{
+    private static SmsClientAccessTool smsClientToolInstance;
+    
+    public static synchronized SmsClientAccessTool getInstance() {
+        if (SmsClientAccessTool.smsClientToolInstance == null) {
+            SmsClientAccessTool.smsClientToolInstance = new SmsClientAccessTool();
+        }
+        return SmsClientAccessTool.smsClientToolInstance;
+    }
+    
+    public String doAccessHTTPPost(final String sendUrl, final String sendParam, String backEncodType) {
+        final StringBuffer receive = new StringBuffer();
+        BufferedWriter wr = null;
+        try {
+            if (backEncodType == null || backEncodType.equals("")) {
+                backEncodType = "UTF-8";
+            }
+            final URL url = new URL(sendUrl);
+            final HttpURLConnection URLConn = (HttpURLConnection)url.openConnection();
+            URLConn.setDoOutput(true);
+            URLConn.setDoInput(true);
+            URLConn.setRequestMethod("POST");
+            URLConn.setUseCaches(false);
+            URLConn.setAllowUserInteraction(true);
+            HttpURLConnection.setFollowRedirects(true);
+            URLConn.setInstanceFollowRedirects(true);
+            URLConn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");
+            URLConn.setRequestProperty("Content-Length", String.valueOf(sendParam.getBytes().length));
+            final DataOutputStream dos = new DataOutputStream(URLConn.getOutputStream());
+            dos.writeBytes(sendParam);
+            final BufferedReader rd = new BufferedReader(new InputStreamReader(URLConn.getInputStream(), backEncodType));
+            String line;
+            while ((line = rd.readLine()) != null) {
+                receive.append(line).append("\r\n");
+            }
+            rd.close();
+        }
+        catch (IOException e) {
+            receive.append("\u8bbf\u95ee\u4ea7\u751f\u4e86\u5f02\u5e38-->").append(e.getMessage());
+            e.printStackTrace();
+        }
+        finally {
+            if (wr != null) {
+                try {
+                    wr.close();
+                }
+                catch (IOException ex) {
+                    ex.printStackTrace();
+                }
+                wr = null;
+            }
+        }
+        return receive.toString();
+    }
+    
+    public String doAccessHTTPGet(final String sendUrl, String backEncodType) {
+        final StringBuffer receive = new StringBuffer();
+        BufferedReader in = null;
+        try {
+            if (backEncodType == null || backEncodType.equals("")) {
+                backEncodType = "UTF-8";
+            }
+            final URL url = new URL(sendUrl);
+            final HttpURLConnection URLConn = (HttpURLConnection)url.openConnection();
+            URLConn.setDoInput(true);
+            URLConn.setDoOutput(true);
+            URLConn.connect();
+            URLConn.getOutputStream().flush();
+            in = new BufferedReader(new InputStreamReader(URLConn.getInputStream(), backEncodType));
+            String line;
+            while ((line = in.readLine()) != null) {
+                receive.append(line).append("\r\n");
+            }
+        }
+        catch (IOException e) {
+            receive.append("\u8bbf\u95ee\u4ea7\u751f\u4e86\u5f02\u5e38-->").append(e.getMessage());
+            e.printStackTrace();
+        }
+        finally {
+            if (in != null) {
+                try {
+                    in.close();
+                }
+                catch (IOException ex) {
+                    ex.printStackTrace();
+                }
+                in = null;
+            }
+        }
+        return receive.toString();
+    }
+}

+ 6 - 0
info_api/core/src/main/java/xgs/net/query/Filter.java

@@ -0,0 +1,6 @@
+package xgs.net.query;
+
+public interface Filter
+{
+    FilterBuilder parse(String p0);
+}

+ 31 - 0
info_api/core/src/main/java/xgs/net/query/FilterBuilder.java

@@ -0,0 +1,31 @@
+package xgs.net.query;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class FilterBuilder
+{
+    private List<Object> params;
+    private String snippets;
+    
+    public FilterBuilder() {
+        this.params = new ArrayList<Object>();
+        this.snippets = "";
+    }
+    
+    public List<Object> getParams() {
+        return this.params;
+    }
+    
+    public void setParams(final List<Object> params) {
+        this.params = params;
+    }
+    
+    public String getSnippets() {
+        return this.snippets;
+    }
+    
+    public void setSnippets(final String snippets) {
+        this.snippets = snippets;
+    }
+}

+ 56 - 0
info_api/core/src/main/java/xgs/net/query/util/LigerEntity.java

@@ -0,0 +1,56 @@
+package xgs.net.query.util;
+
+public class LigerEntity
+{
+    private String field;
+    private String op;
+    private String value;
+    private String type;
+    
+    public String getField() {
+        return this.field;
+    }
+    
+    public void setField(final String field) {
+        this.field = field;
+    }
+    
+    public String getOp() {
+        return this.op;
+    }
+    
+    public void setOp(final String op) {
+        this.op = op;
+    }
+    
+    public String getValue() {
+        return this.value;
+    }
+    
+    public void setValue(final String value) {
+        this.value = value;
+    }
+    
+    public String getType() {
+        return this.type;
+    }
+    
+    public void setType(final String type) {
+        this.type = type;
+    }
+    
+    public enum opration
+    {
+        equal, 
+        notequal, 
+        startwith, 
+        endwith, 
+        like, 
+        greater, 
+        greaterorequal, 
+        less, 
+        lessorequal, 
+        in, 
+        notin;
+    }
+}

+ 165 - 0
info_api/core/src/main/java/xgs/net/query/util/LigerFilter.java

@@ -0,0 +1,165 @@
+package xgs.net.query.util;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import xgs.net.query.Filter;
+import xgs.net.query.FilterBuilder;
+import xgs.net.utils.StrUtils;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class LigerFilter implements Filter
+{
+    private static Logger log;
+    private static String blank;
+    private static Map<String, String> opration;
+    private static Map<String, String> params;
+    private static LigerFilter instance;
+    
+    public static LigerFilter getInstance() {
+        if (LigerFilter.instance == null) {
+            LigerFilter.instance = new LigerFilter();
+        }
+        return LigerFilter.instance;
+    }
+    
+    private Entity factory(final JSONObject obj) {
+        final StringBuilder sb = new StringBuilder();
+        final String op = obj.getString(fields.op.name());
+        final String value = obj.getString(fields.value.name());
+        String param = obj.getString(value);
+        sb.append(obj.getString(fields.field.name()));
+        sb.append(LigerFilter.blank);
+        if (LigerFilter.opration.containsKey(op)) {
+            sb.append(LigerFilter.blank);
+            sb.append(LigerFilter.opration.get(op));
+            param = LigerFilter.params.get(op).replace("?", value);
+            final Entity entity = new Entity();
+            entity.setParam(param);
+            entity.setSnippets(sb.toString());
+            return entity;
+        }
+        return null;
+    }
+    
+    private Entity builder(JSONObject obj) {
+        final StringBuilder sb = new StringBuilder();
+        sb.append(LigerFilter.blank);
+        sb.append(rule.and.name());
+        sb.append(LigerFilter.blank);
+        final Entity entity = this.factory(obj);
+        sb.append(entity.getSnippets());
+        entity.setSnippets(sb.toString());
+        return entity;
+    }
+    
+    public HashMap<String, Object> parsetoMap(String text) {
+        if (StrUtils.isBlank(text)) {
+            return null;
+        }
+        final JSONObject object = JSON.parseObject(text);
+        final JSONArray list = (JSONArray)object.get("rules");
+        final HashMap<String, Object> map = new HashMap<>();
+        for (int i = 0, len = list.size(); i < len; ++i) {
+            final JSONObject obj = list.getJSONObject(i);
+            map.put(obj.getString(fields.field.name()), obj.getString(fields.value.name()));
+        }
+        return map;
+    }
+    
+    @Override
+    public FilterBuilder parse(String text) {
+        FilterBuilder fe = new FilterBuilder();
+        if (StrUtils.notBlank(text)) {
+            JSONObject object = JSON.parseObject(text);
+            JSONArray list = (JSONArray)object.get("rules");
+            StringBuilder sb = new StringBuilder();
+            List<Object> params = new ArrayList<>();
+            for (int i = 0, len = list.size(); i < len; ++i) {
+                JSONObject obj = list.getJSONObject(i);
+                Entity entity = this.builder(obj);
+                sb.append(entity.getSnippets());
+                params.add(entity.getParam());
+            }
+            fe.setParams(params);
+            fe.setSnippets(sb.toString());
+        }
+        LigerFilter.log.debug(JSON.toJSONString(fe));
+        return fe;
+    }
+    
+    public static void main(final String[] args) {
+        final String where = "{\"rules\":[{\"field\":\"user_name\",\"op\":\"equal\",\"value\":\"aa\",\"type\":\"text\"},{\"field\":\"state\",\"op\":\"equal\",\"value\":\"1\",\"type\":\"select\"}]}  ";
+        final LigerFilter filter = getInstance();
+        filter.parse(where);
+    }
+    
+    static {
+        LigerFilter.log = LoggerFactory.getLogger(LigerFilter.class);
+        LigerFilter.blank = " ";
+        (LigerFilter.opration = new HashMap<>()).put("equal", " = ? ");
+        LigerFilter.opration.put("notequal", " <> ? ");
+        LigerFilter.opration.put("startwith", " like ? ");
+        LigerFilter.opration.put("endwith", " like ? ");
+        LigerFilter.opration.put("like", " like ? ");
+        LigerFilter.opration.put("greater", " > ? ");
+        LigerFilter.opration.put("greaterorequal", " >= ? ");
+        LigerFilter.opration.put("less", " < ? ");
+        LigerFilter.opration.put("lessorequal", " <= ? ");
+        LigerFilter.opration.put("in", "like ? ");
+        LigerFilter.opration.put("notin", " not like ? ");
+        (LigerFilter.params = new HashMap<>()).put("equal", "?");
+        LigerFilter.params.put("notequal", "?");
+        LigerFilter.params.put("startwith", "?%");
+        LigerFilter.params.put("endwith", "%?");
+        LigerFilter.params.put("like", "%?%");
+        LigerFilter.params.put("greater", "?");
+        LigerFilter.params.put("greaterorequal", "?");
+        LigerFilter.params.put("less", "?");
+        LigerFilter.params.put("lessorequal", "?");
+        LigerFilter.params.put("in", "%?%");
+        LigerFilter.params.put("notin", "%?%");
+    }
+    
+    private enum fields
+    {
+        field, 
+        op, 
+        value, 
+        type;
+    }
+    
+    private enum rule
+    {
+        and, 
+        or;
+    }
+    
+    class Entity
+    {
+        private String param;
+        private String snippets;
+        
+        public String getParam() {
+            return this.param;
+        }
+        
+        public void setParam(final String param) {
+            this.param = param;
+        }
+        
+        public String getSnippets() {
+            return this.snippets;
+        }
+        
+        public void setSnippets(final String snippets) {
+            this.snippets = snippets;
+        }
+    }
+}

+ 140 - 0
info_api/core/src/main/java/xgs/net/service/BaseService.java

@@ -0,0 +1,140 @@
+package xgs.net.service;
+
+import com.jfinal.aop.Before;
+import com.jfinal.plugin.activerecord.Db;
+import com.jfinal.plugin.activerecord.Model;
+import com.jfinal.plugin.activerecord.Table;
+import com.jfinal.plugin.activerecord.TableMapping;
+import com.jfinal.plugin.activerecord.tx.Tx;
+import com.jfinal.plugin.redis.Cache;
+import com.jfinal.plugin.redis.Redis;
+import xgs.net.annotation.Entity;
+import xgs.net.annotation.Inject;
+import xgs.net.controller.BaseController;
+//import xgs.net.model.TbUser;
+import xgs.net.token.JwtToken;
+
+import java.util.List;
+
+public class BaseService<T extends Model>
+{
+
+    private static final String userCoustmerSession = "group";
+    private static final int expire = 7*60*60*24;
+    private static final Cache redis = Redis.use();
+    public static final int batchSize = 1000;
+    @Inject
+    public T dao;
+    private static final String deleteByIds = "delete from %s where id = ? ";
+    private static final String findAllSql = "select * from %s";
+    private static final String AddPraiseSql = "update %s set praise = praise+1  where id = ?";
+    private static final String MinusPraiseSql = "update %s set praise = praise-1  where id = ?";
+    private static final String AddFavoriteSql = "  update %s set favorite = favorite+1 where id = ?";
+    private static final String MinusFavoriteSql = "  update %s set favorite = favorite-1 where id = ?";
+    private static final String AddCommentSql = "  update %s set comment = comment+1 where id = ?";
+    private static final String MinusCommentSql = "  update %s set comment = comment-1 where id = ?";
+    private static final String isFavoriteSql = "select count(1) from tb_favorite where trande_id = ? and user_id = ?";
+    private static final String isPraiseSql = "select count(1) from tb_praise where trande_id = ? and user_id = ?";
+
+    protected Entity getEntity() {
+        return this.dao.getClass().getAnnotation(Entity.class);
+    }
+    
+    protected String tableName() {
+        return this.dao.getClass().getAnnotation(Entity.class).value();
+    }
+    
+    protected Table getTable() {
+        return TableMapping.me().getTable(this.dao.getClass());
+    }
+    
+    public T findById(Object id) {
+        return (T)dao.findById(id);
+    }
+    
+    public void deleteById(final Object id) {
+        this.dao.deleteById(id);
+    }
+    
+    protected Object[][] assembleIds(final Object... ids) {
+        final Object[][] temps = new Object[ids.length][1];
+        final int i = 0;
+        for (final Object id : ids) {
+            temps[i][0] = id;
+        }
+        return temps;
+    }
+
+//    protected void cacheToken(String JwtToken, TbUser user) {
+//        BaseService.redis.setex(JwtToken, expire, user);
+//    }
+
+    protected Object[][] assembleIds(final Object id, final Object... ids) {
+        final Object[][] temps = new Object[ids.length][2];
+        final int i = 0;
+        for (final Object _id : ids) {
+            temps[i][0] = _id;
+            temps[i][1] = id;
+        }
+        return temps;
+    }
+    
+    public void deleteByIds(Object... ids) {
+        for (Object id : ids) {
+            Db.update(String.format(deleteByIds, this.tableName()), id);
+        }
+    }
+    
+    public List<T> findAll() {
+        return this.dao.find(String.format(findAllSql, this.tableName()));
+    }
+    
+    @Before({ Tx.class })
+    public void AddPraise(Long id) {
+        Db.update(String.format(AddPraiseSql, this.tableName()), id);
+    }
+    
+    @Before({ Tx.class })
+    public void MinusPraise(Long id) {
+        Db.update(String.format(MinusPraiseSql, this.tableName()), id);
+    }
+    
+    @Before({ Tx.class })
+    public void AddFavorite(Long id) {
+        Db.update(String.format(AddFavoriteSql, this.tableName()), id);
+    }
+    
+    @Before({ Tx.class })
+    public void MinusFavorite(Long id) {
+        Db.update(String.format(MinusFavoriteSql, this.tableName()), id);
+    }
+    
+    @Before({ Tx.class })
+    public void AddComment(Long id) {
+        Db.update(String.format(AddCommentSql, this.tableName()), id);
+    }
+    
+    @Before({ Tx.class })
+    public void MinusComment(Long id) {
+        Db.update(String.format(MinusCommentSql, this.tableName()), id);
+    }
+
+    
+    public int isFavorite(Long trandeId, Long userId) {
+        return Db.queryInt(isFavoriteSql, trandeId, userId);
+    }
+    
+    public int isPraise(Long trandeId, Long userId) {
+        return Db.queryInt(isPraiseSql, trandeId, userId);
+    }
+
+
+    protected String getToken(Long id){
+        String token = JwtToken.createToken(id);
+        return  userCoustmerSession + "-" + token;
+    }
+
+    protected void clearToken(String token){
+        redis.expire(token,0);
+    }
+}

+ 42 - 0
info_api/core/src/main/java/xgs/net/service/InfoListService.java

@@ -0,0 +1,42 @@
+package xgs.net.service;
+
+import com.jfinal.plugin.activerecord.Page;
+import xgs.net.annotation.Service;
+import xgs.net.entity.PageEntity;
+import xgs.net.exception.XgsException;
+import xgs.net.model.TbInfoList;
+import xgs.net.utils.IdGen;
+
+@Service
+public class InfoListService extends BaseService<TbInfoList> {
+
+    private static final String findList = " SELECT * ";
+    private static final String findListExcept = " FROM tb_info_list WHERE type = ? ";
+
+    public void save(String name,String collega,String type,String postion,String phone,
+                     Integer isParty,String work,Long sendDate){
+        try {
+            TbInfoList infoList = new TbInfoList();
+            infoList.setId(IdGen.getId());
+            infoList.setName(name);
+            infoList.setCollege(collega);
+            infoList.setType(type);
+            infoList.setPhone(phone);
+            infoList.setIsParty(isParty);
+            infoList.setPosition(postion);
+            infoList.setWorkUnit(work);
+            infoList.setSendDate(sendDate);
+            infoList.setCreated(System.currentTimeMillis());
+            infoList.save();
+        }catch (Exception e){
+            if(e.getMessage() != null && e.getMessage().contains("phone_unique")){
+                throw new XgsException(20021,"您已经报过名");
+            }
+        }
+
+    }
+
+    public Page<TbInfoList> page(PageEntity pageEntity,String type){
+        return this.dao.paginate(pageEntity.getPageNo(),pageEntity.getPageSize(),findList,findListExcept,type);
+    }
+}

+ 39 - 0
info_api/core/src/main/java/xgs/net/session/RedisSessionManager.java

@@ -0,0 +1,39 @@
+package xgs.net.session;
+
+import com.jfinal.plugin.redis.Cache;
+import com.jfinal.plugin.redis.Redis;
+
+public class RedisSessionManager implements SessionManager
+{
+    private final String SESSION_PREFIX = "xgs.net.session:";
+    private final Cache cache;
+    
+    public RedisSessionManager() {
+        this.cache = Redis.use();
+    }
+    
+    public RedisSessionManager(final String cacheName) {
+        this.cache = Redis.use(cacheName);
+    }
+    
+    public RedisSessionManager(final Cache cache) {
+        this.cache = cache;
+    }
+    
+    @Override
+    public Session get(final String sessionId) {
+        return (Session)this.cache.get("xgs.net.session:".concat(sessionId));
+    }
+
+    @Override
+    public void save(final Session session) {
+        final String sessionId = session.getId();
+        final int seconds = 100000;
+        this.cache.setex("xgs.net.session:".concat(sessionId), seconds, session);
+    }
+
+    @Override
+    public void update(final Session session) {
+        this.save(session);
+    }
+}

+ 117 - 0
info_api/core/src/main/java/xgs/net/session/Session.java

@@ -0,0 +1,117 @@
+package xgs.net.session;
+
+import com.jfinal.core.JFinal;
+
+import javax.servlet.ServletContext;
+import javax.servlet.http.HttpSession;
+import javax.servlet.http.HttpSessionContext;
+import java.io.Serializable;
+import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
+
+class Session implements HttpSession, Serializable
+{
+    private static final long serialVersionUID = -719739616470614546L;
+    protected String id;
+    protected final Map<String, Object> attributes;
+    protected final long creationTime;
+    protected volatile int maxInactiveInterval;
+    protected volatile boolean isNew;
+    protected transient SessionManager manager;
+    
+    public Session(final String id) {
+        this.id = null;
+        this.attributes = new ConcurrentHashMap<String, Object>();
+        this.creationTime = System.currentTimeMillis();
+        this.maxInactiveInterval = -1;
+        this.isNew = false;
+        this.id = id;
+    }
+    
+    public Object getAttribute(final String key) {
+        return this.attributes.get(key);
+    }
+    
+    public Enumeration getAttributeNames() {
+        final Set<String> names = new HashSet<String>();
+        names.addAll(this.attributes.keySet());
+        return Collections.enumeration(names);
+    }
+    
+    public long getCreationTime() {
+        return this.creationTime;
+    }
+    
+    public String getId() {
+        return this.id;
+    }
+    
+    public long getLastAccessedTime() {
+        return this.creationTime;
+    }
+    
+    public int getMaxInactiveInterval() {
+        return this.getMaxInactiveInterval();
+    }
+    
+    public ServletContext getServletContext() {
+        return JFinal.me().getServletContext();
+    }
+    
+    @Deprecated
+    public HttpSessionContext getSessionContext() {
+        return null;
+    }
+    
+    @Deprecated
+    public Object getValue(final String key) {
+        return this.getAttribute(key);
+    }
+    
+    @Deprecated
+    public String[] getValueNames() {
+        return this.attributes.keySet().toArray(new String[0]);
+    }
+    
+    public void invalidate() {
+    }
+    
+    public boolean isNew() {
+        return this.isNew;
+    }
+    
+    @Deprecated
+    public void putValue(final String key, final Object value) {
+        this.setAttribute(key, value);
+    }
+    
+    public synchronized void removeAttribute(final String key) {
+        this.attributes.remove(key);
+        this.manager.update(this);
+    }
+    
+    @Deprecated
+    public void removeValue(final String key) {
+        this.removeAttribute(key);
+    }
+    
+    public synchronized void setAttribute(final String key, final Object value) {
+        if (key == null) {
+            throw new IllegalArgumentException("setAttribute: name parameter cannot be null");
+        }
+        if (value == null) {
+            this.removeAttribute(key);
+            return;
+        }
+        this.attributes.put(key, value);
+        this.manager.update(this);
+    }
+    
+    public void setMaxInactiveInterval(final int interval) {
+        this.maxInactiveInterval = interval;
+    }
+    
+    public synchronized void setManager(final SessionManager manager) {
+        this.manager = manager;
+    }
+}

+ 10 - 0
info_api/core/src/main/java/xgs/net/session/SessionManager.java

@@ -0,0 +1,10 @@
+package xgs.net.session;
+
+public interface SessionManager
+{
+    Session get(final String p0);
+    
+    void save(final Session p0);
+    
+    void update(final Session p0);
+}

+ 90 - 0
info_api/core/src/main/java/xgs/net/session/SessionRepositoryRequestWrapper.java

@@ -0,0 +1,90 @@
+package xgs.net.session;
+
+import com.jfinal.kit.StrKit;
+import xgs.net.utils.StrUtils;
+import xgs.net.utils.WebUtils;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletRequestWrapper;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+
+public class SessionRepositoryRequestWrapper extends HttpServletRequestWrapper
+{
+    private static SessionManager sessionManager;
+    private static String sessionCookieDomain;
+    private static String sessionCookieName;
+    private static int maxAgeInSeconds;
+    private final HttpServletResponse response;
+
+    public static void initCfg(final String sessionCookieDomain, final int maxAgeInSeconds, final String sessionId, final String cacheName) {
+        SessionRepositoryRequestWrapper.sessionCookieDomain = sessionCookieDomain;
+        SessionRepositoryRequestWrapper.maxAgeInSeconds = maxAgeInSeconds * 60;
+        SessionRepositoryRequestWrapper.sessionCookieName = sessionId;
+        SessionRepositoryRequestWrapper.sessionManager = new RedisSessionManager(cacheName);
+    }
+
+    public SessionRepositoryRequestWrapper(final HttpServletRequest request, final HttpServletResponse response) {
+        super(request);
+        this.response = response;
+    }
+
+    private HttpServletRequest getHttpRequest() {
+        return (HttpServletRequest)super.getRequest();
+    }
+
+    private String getSessionId() {
+        final HttpServletRequest request = this.getHttpRequest();
+        return WebUtils.getCookie(request, SessionRepositoryRequestWrapper.sessionCookieName);
+    }
+
+    public String getRequestedSessionId() {
+        return this.getSessionId();
+    }
+
+    public HttpSession getSession() {
+        String sessionId = this.getRequestedSessionId();
+        if (null == sessionId) {
+            sessionId = StrUtils.getRandomUUID();
+            WebUtils.setCookie(this.response, SessionRepositoryRequestWrapper.sessionCookieName, sessionId, SessionRepositoryRequestWrapper.sessionCookieDomain, SessionRepositoryRequestWrapper.maxAgeInSeconds);
+        }
+        Session session = SessionRepositoryRequestWrapper.sessionManager.get(sessionId);
+        if (null == session) {
+            session = new Session(sessionId);
+            session.setMaxInactiveInterval(SessionRepositoryRequestWrapper.maxAgeInSeconds);
+            SessionRepositoryRequestWrapper.sessionManager.save(session);
+        }
+        else {
+            session.setMaxInactiveInterval(SessionRepositoryRequestWrapper.maxAgeInSeconds);
+            SessionRepositoryRequestWrapper.sessionManager.update(session);
+        }
+        session.setManager(SessionRepositoryRequestWrapper.sessionManager);
+        return (HttpSession)session;
+    }
+
+    public HttpSession getSession(final boolean create) {
+        if (create) {
+            return this.getSession();
+        }
+        final String sessionId = this.getRequestedSessionId();
+        if (null == sessionId) {
+            return null;
+        }
+        final Session session = SessionRepositoryRequestWrapper.sessionManager.get(sessionId);
+        session.setMaxInactiveInterval(SessionRepositoryRequestWrapper.maxAgeInSeconds);
+        SessionRepositoryRequestWrapper.sessionManager.update(session);
+        if (null != session) {
+            session.setManager(SessionRepositoryRequestWrapper.sessionManager);
+        }
+        return (HttpSession)session;
+    }
+
+    public boolean isRequestedSessionIdValid() {
+        final String sessionId = this.getRequestedSessionId();
+        return StrKit.notBlank(sessionId);
+    }
+
+    static {
+        SessionRepositoryRequestWrapper.sessionCookieName = "PHPSESSION";
+    }
+}

+ 18 - 0
info_api/core/src/main/java/xgs/net/utils/JsonUtils.java

@@ -0,0 +1,18 @@
+package xgs.net.utils;
+
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.serializer.SerializeConfig;
+import com.alibaba.fastjson.serializer.SerializerFeature;
+
+public class JsonUtils
+{
+    private static SerializeConfig serializeConfig;
+    
+    public static String Long2String(Object object) {
+        return JSONObject.toJSONString(object, JsonUtils.serializeConfig, new SerializerFeature[0]);
+    }
+    
+    static {
+        (JsonUtils.serializeConfig = new SerializeConfig()).put(Long.class, LongToStringSerializer.instance);
+    }
+}

+ 31 - 0
info_api/core/src/main/java/xgs/net/utils/LongToStringSerializer.java

@@ -0,0 +1,31 @@
+package xgs.net.utils;
+
+import com.alibaba.fastjson.serializer.JSONSerializer;
+import com.alibaba.fastjson.serializer.ObjectSerializer;
+import com.alibaba.fastjson.serializer.SerializeWriter;
+
+import java.io.IOException;
+import java.lang.reflect.Type;
+
+public class LongToStringSerializer implements ObjectSerializer
+{
+    public static final LongToStringSerializer instance;
+    
+    public void write(JSONSerializer jsonSerializer, Object object, Object fieldName, Type type, int i) throws IOException {
+        SerializeWriter out = jsonSerializer.getWriter();
+        if (object == null) {
+            out.writeNull();
+            return;
+        }
+        if (object instanceof Long) {
+            String strVal = object.toString();
+            out.writeString(strVal);
+            return;
+        }
+        JSONSerializer.write(out, object);
+    }
+    
+    static {
+        instance = new LongToStringSerializer();
+    }
+}

+ 18 - 0
info_api/core/src/main/java/xgs/net/utils/MyJson.java

@@ -0,0 +1,18 @@
+package xgs.net.utils;
+
+import com.jfinal.json.JFinalJson;
+
+import java.math.BigInteger;
+
+public class MyJson extends JFinalJson
+{
+    protected String toJson(Object value, int depth) {
+        if (value == null || depth-- < 0) {
+            return "null";
+        }
+        if (value instanceof Long || value instanceof BigInteger) {
+            return "\"" + String.valueOf(value) + "\"";
+        }
+        return super.toJson(value, depth);
+    }
+}

+ 27 - 0
info_api/core/src/main/java/xgs/net/utils/MyJsonFactory.java

@@ -0,0 +1,27 @@
+package xgs.net.utils;
+
+import com.alibaba.fastjson.serializer.SerializeConfig;
+import com.jfinal.json.IJsonFactory;
+import com.jfinal.json.Json;
+import com.jfinal.plugin.activerecord.Record;
+
+public class MyJsonFactory implements IJsonFactory
+{
+    private static final MyJsonFactory me;
+    
+    public static MyJsonFactory me() {
+        return MyJsonFactory.me;
+    }
+    
+    public Json getJson() {
+        return new MyJson();
+    }
+    
+    public void removeRecordSerializer() {
+        SerializeConfig.getGlobalInstance().put(Record.class, null);
+    }
+    
+    static {
+        me = new MyJsonFactory();
+    }
+}

+ 18 - 0
info_api/core/src/main/resources/cfg.properties

@@ -0,0 +1,18 @@
+system.xgs.net.dev=true
+system.db=xgs.net.init.MysqlDb
+system.annotation.scan=xgs.net
+
+
+session.enable=false
+session.domain=127.0.0.1
+session.maxAgeInSeconds=30
+session.id=PHPSESSION
+session.cache=main
+
+cache.enable=true
+cache.redis.host=127.0.0.1
+cache.redis.port=6379
+
+cache.redis.wx.name=wx_main
+
+solr.url=http://47.93.118.3:8199/solr/city_dynamic/

+ 17 - 0
info_api/core/src/main/resources/error.properties

@@ -0,0 +1,17 @@
+favorite.exist=30000
+30000=\u60A8\u5DF2\u6536\u85CF\u6B64\u6761
+focus.exist=31000
+31000=\u60A8\u5DF2\u5173\u6CE8\u6B64\u6761
+reply.notExist=32000
+32000=\u56DE\u590D\u7684\u76EE\u6807\u4E0D\u5B58\u5728
+reply.delete.notExist=32001
+32001=\u5220\u9664\u7684\u76EE\u6807\u4E0D\u5B58\u5728
+
+entity.exist=33000
+33000=\u4F01\u4E1A\u5DF2\u5B58\u5728
+entity.area.not=33001
+33001=\u9519\u8BEF\u7684\u5730\u57DF\u4FE1\u606F
+entity.cate.not=33002
+33002=\u9519\u8BEF\u7684\u5206\u7C7B\u4FE1\u606F
+entity.register.codeerror=33003
+33003=\u9A8C\u8BC1\u7801\u9519\u8BEF

+ 11 - 0
info_api/core/src/main/resources/jdbc.properties

@@ -0,0 +1,11 @@
+jdbc.mysql.url=jdbc:mysql://127.0.0.1:3306/db_information_table?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC
+
+
+jdbc.mysql.user=root
+jdbc.mysql.password=Shs2514
+jdbc.mysql.validation_query=select 1
+
+
+jdbc.max_poll=100
+jdbc.min_poll=10
+jdbc.show_sql=true

+ 15 - 0
info_api/core/src/main/resources/logback.properties

@@ -0,0 +1,15 @@
+file.path=logs
+file.maxSize=100MB
+
+socket.host=192.168.10.100
+socket.port=8122
+socket.delay=300
+socket.caller=true
+socket.queue=10
+
+jdbc.dataSource=com.mchange.v2.c3p0.ComboPooledDataSource
+jdbc.clazz=com.mysql.jdbc.Driver
+jdbc.dialect=ch.qos.logback.core.db.dialect.MySQLDialect
+jdbc.url=jdbc:mysql://127.0.0.1:3306/logback?useUnicode=true&characterEncoding=utf-8
+jdbc.user=root
+jdbc.password=

+ 93 - 0
info_api/core/src/main/resources/logback.xml

@@ -0,0 +1,93 @@
+<configuration>
+	<property resource="logback.properties" />
+	<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+		<encoder>
+			<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger -%msg%n</pattern>
+		</encoder>
+	</appender>
+	
+	<appender name="FILE"
+		class="ch.qos.logback.core.rolling.RollingFileAppender">
+		<file>${file.path}/logFile.log</file>
+		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+			<!-- rollover daily -->
+			<fileNamePattern>${file.path}/logFile.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+			<timeBasedFileNamingAndTriggeringPolicy
+				class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+				<!-- or whenever the file size reaches 100MB -->
+				<maxFileSize>${file.maxSize}</maxFileSize>
+			</timeBasedFileNamingAndTriggeringPolicy>
+			<!-- keep 30 days worth of history -->
+			<!-- <maxHistory>30</maxHistory> -->
+		</rollingPolicy>
+		<encoder>
+			<pattern>%-4relative [%thread] %-5level %logger{35} -%msg%n</pattern>
+		</encoder>
+	</appender>
+
+	<appender name="FILE-ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
+		<file>${file.path}/logFile-error.log</file>
+		<filter class="ch.qos.logback.classic.filter.LevelFilter">
+			<level>ERROR</level>
+			<onMatch>ACCEPT</onMatch>
+			<onMismatch>DENY</onMismatch>
+		</filter>
+		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+			<fileNamePattern>${file.path}/logFile-error.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+			<maxHistory>7</maxHistory>
+			<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+				<maxFileSize>${file.maxSize}</maxFileSize>
+			</timeBasedFileNamingAndTriggeringPolicy>
+		</rollingPolicy>
+	</appender>
+	<appender name="FILE-INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
+		<file>${file.path}/logFile-error.log</file>
+		<filter class="ch.qos.logback.classic.filter.LevelFilter">
+			<level>INFO</level>
+			<onMatch>ACCEPT</onMatch>
+			<onMismatch>DENY</onMismatch>
+		</filter>
+		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+			<fileNamePattern>${file.path}/logFile-error.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+			<maxHistory>7</maxHistory>
+			<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+				<maxFileSize>${file.maxSize}</maxFileSize>
+			</timeBasedFileNamingAndTriggeringPolicy>
+		</rollingPolicy>
+	</appender>
+
+	<!-- <appender name="SOCKET" class="com.xgs.socket.XgsSocketAppender">
+		<formatter class="com.xgs.socket.formatter.JsonFormatter">
+			<expectJson>false</expectJson>
+		</formatter>
+		<RemoteHost>${socket.host}</RemoteHost>
+		<Port>${socket.port}</Port>
+		<ReconnectionDelay>${socket.delay}</ReconnectionDelay>
+		<IncludeCallerData>${socket.caller}</IncludeCallerData>
+		<queueSize>${socket.queue}</queueSize>
+	</appender>
+
+	<appender name="DB" class="ch.qos.logback.classic.db.DBAppender">
+		<connectionSource class="ch.qos.logback.core.db.DataSourceConnectionSource">
+			<dataSource class="${jdbc.dataSource}">
+				<driverClass>${jdbc.clazz}</driverClass>
+				<jdbcUrl>${jdbc.url}</jdbcUrl>
+				<user>${jdbc.user}</user>
+				<password>${jdbc.password}</password>
+			</dataSource>
+		</connectionSource>
+	</appender> -->
+	
+	<root level="debugger">
+		<appender-ref ref="STDOUT" />
+		<appender-ref ref="FILE" />
+		<appender-ref ref="FILE-ERROR" />
+		<appender-ref ref="FILE-INFO" />
+	</root>
+	<logger name="ch.qos.logback.core" level="ERROR" />
+	<logger name="ch.qos.logback.classic" level="ERROR" />
+	<logger name="io.netty.util" level="ERROR" />
+	<logger name="io.netty.buffer" level="ERROR" />
+	<logger name="druid.sql" level="INFO" />
+
+</configuration>

+ 2 - 0
info_api/core/src/main/resources/mchange-log.properties

@@ -0,0 +1,2 @@
+com.mchange.v2.log.MLog=com.mchange.v2.log.FallbackMLog 
+com.mchange.v2.log.FallbackMLog.DEFAULT_CUTOFF_LEVEL=OFF

+ 17 - 0
info_api/core/src/main/resources/model_template.jf

@@ -0,0 +1,17 @@
+package #(modelPackageName);
+
+import xgs.net.annotation.Entity;
+import #(baseModelPackageName).#(tableMeta.baseModelName);
+
+/**
+ * Generated by JFinal.
+ */
+@SuppressWarnings("serial")
+@Entity(value="#(tableMeta.name)",comment="#(tableMeta.remarks)")
+public class #(tableMeta.modelName) extends #(tableMeta.baseModelName)<#(tableMeta.modelName)> {
+    #if (generateDaoInModel)
+    public static final #(tableMeta.modelName) dao = new #(tableMeta.modelName)().dao();
+    #else
+
+    #end
+}

+ 220 - 0
info_api/core/src/main/resources/validation.json

@@ -0,0 +1,220 @@
+{
+  "sys_user":{
+    "username":{
+      "label":"用户名",
+      "validation":[
+        {
+          "xgsType":"required",
+          "required":true,
+          "message":"用户名不能为空"
+        },
+        {
+          "xgsType":"string",
+          "type":"string",
+          "max":8,
+          "min":2,
+          "message":"用户名在2-8个字符之间"
+        }
+      ]
+    },
+    "mobile":{
+      "label":"手机号",
+      "validation":[
+        {
+          "xgsType":"required",
+          "required":true,
+          "message":"手机号不能为空"
+        },
+        {
+          "xgsType":"mobile",
+          "mobile":true,
+          "message":"请输入正确的手机号"
+        }
+      ]
+    },
+    "email":{
+      "label":"邮箱",
+      "validation":[
+        {
+          "xgsType":"required",
+          "required":true,
+          "message":"邮箱不能为空"
+        },
+        {
+          "xgsType":"email",
+          "email":true,
+          "message":"请输入正确的邮箱地址"
+        },
+        {
+          "xgsType":"string",
+          "type":"string",
+          "max":50,
+          "message":"邮箱长度需要在50个字符以内"
+        }
+      ]
+    },
+    "open_id":{
+      "label":"openId",
+      "validation":[
+        {
+          "xgsType":"string",
+          "type":"string",
+          "max":64,
+          "message":"微信认证ID不合法"
+        }
+      ]
+    },
+    "dept_id":{
+      "label":"所属部门",
+      "validation":[
+        {
+          "xgsType":"required",
+          "required":true,
+          "message":"必须提供用户所在的部门"
+        },
+        {
+          "xgsType":"bigint",
+          "type":"bigint",
+          "message":"必须提供有效的用户所在部门"
+        }
+      ]
+    },
+    "status":{
+      "label":"用户状态",
+      "validation":[
+        {
+          "xgsType":"required",
+          "required":true,
+          "message":"必须指定用户的状态"
+        },
+        {
+          "xgsType":"integer",
+          "type":"integer",
+          "max":2,
+          "min":0,
+          "message":"指定用户的状态不合法"
+        }
+      ]
+    },
+    "description":{
+      "label":"备注",
+      "validation":[
+        {
+          "xgsType":"string",
+          "type":"string",
+          "max":512,
+          "message":"备注不可以超过512个字符"
+        }
+      ]
+    }
+  },
+  "sys_dept":{
+    "name":{
+      "label":"部门名称",
+      "validation":[
+        {
+          "xgsType":"required",
+          "required":true,
+          "message":"部门名称不能为空"
+        },
+        {
+          "xgsType":"string",
+          "type":"string",
+          "max":20,
+          "min":2,
+          "message":"部门名称在2-20个字符之间"
+        }
+      ]
+    },
+    "parent_id":{
+      "label":"上级部门名称",
+      "validation":[
+        {
+          "xgsType":"bigint",
+          "type":"bigint",
+          "message":"必须提供有效的上级部门"
+        }
+      ]
+    },
+    "seq":{
+      "label":"排序",
+      "validation":[
+        {
+          "xgsType":"integer",
+          "type":"integer",
+          "message":"展示顺序不合法"
+        }
+      ]
+    },
+    "description":{
+      "label":"备注",
+      "validation":[
+        {
+          "xgsType":"string",
+          "type":"string",
+          "max":512,
+          "message":"备注不可以超过512个字符"
+        }
+      ]
+    }
+  },
+  "sys_role":{
+    "name":{
+      "label":"角色名称",
+      "validation":[
+        {
+          "xgsType":"required",
+          "required":true,
+          "message":"角色名称不能为空"
+        },
+        {
+          "xgsType":"string",
+          "type":"string",
+          "max":20,
+          "min":2,
+          "message":"角色名称在2-20个字符之间"
+        }
+      ]
+    },
+    "type":{
+      "label":"角色类型",
+      "validation":[
+        {
+          "xgsType":"integer",
+          "type":"integer",
+          "max":2,
+          "min":1,
+          "message":"角色类型不合法"
+        }
+      ]
+    },
+    "status":{
+      "label":"角色状态",
+      "validation":[
+        {
+          "xgsType":"required",
+          "required":true,
+          "message":"角色状态不可以为空"
+        },
+        {
+          "xgsType":"integer",
+          "type":"integer",
+          "max":2,
+          "min":1,
+          "message":"角色状态不合法"
+        }
+      ]
+    },
+    "description":{
+      "label":"备注",
+      "validation":[
+        {
+          "xgsType":"string",
+          "type":"string",
+          "max":512,
+          "message":"备注不可以超过512个字符"
+        }
+      ]
+    }
+  }
+}

+ 1 - 0
info_api/core/src/main/resources/validation.properties

@@ -0,0 +1 @@
+sysuser.save=½ÚÈÕ

+ 23 - 0
info_api/core/src/main/resources/validation.xml

@@ -0,0 +1,23 @@
+<validtion>
+    <sysuser>
+        <username>
+            <property key="required" value="true"/>
+            <property key="maxLength" value="8"/>
+            <property key="minLength" value="2"/>
+        </username>
+        <mobile>
+            <property key="required" value="true"/>
+            <property key="mobile" value="true"/>
+        </mobile>
+        <email>
+            <property key="required" value="true"/>
+            <property key="email" value="true"/>
+        </email>
+        <open_id>
+            <property key="maxLength" value="64"/>
+        </open_id>
+        <dept_id>
+            <property key="required" value="true"/>
+        </dept_id>
+    </sysuser>
+</validtion>

BIN
info_api/dump.rdb


+ 34 - 0
info_api/entity/pom.xml

@@ -0,0 +1,34 @@
+<?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>vipp</artifactId>
+        <groupId>xgs.net</groupId>
+        <version>1.0</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>entity</artifactId>
+
+    <dependencies>
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.jfinal</groupId>
+            <artifactId>jfinal</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>druid</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>xgs.net</groupId>
+            <artifactId>ioc</artifactId>
+            <version>1.0</version>
+            <scope>compile</scope>
+        </dependency>
+    </dependencies>
+</project>

+ 51 - 0
info_api/entity/src/main/java/genrator/GeneratorBean.java

@@ -0,0 +1,51 @@
+package genrator;
+
+import com.jfinal.kit.PathKit;
+import com.jfinal.kit.Prop;
+import com.jfinal.kit.PropKit;
+import com.jfinal.plugin.activerecord.dialect.MysqlDialect;
+import com.jfinal.plugin.activerecord.generator.BaseModelGenerator;
+import com.jfinal.plugin.activerecord.generator.DataDictionaryGenerator;
+import com.jfinal.plugin.activerecord.generator.Generator;
+import com.jfinal.plugin.druid.DruidPlugin;
+import xgs.net.generator.MdDataDictionaryGenerator;
+import xgs.net.generator.XgsModelGenerator;
+
+import javax.sql.DataSource;
+
+public class GeneratorBean
+{
+    public static DataSource getDataSource() {
+        Prop p = PropKit.use("jdbc.properties");
+        DruidPlugin druidPlugin = new DruidPlugin(p.get("jdbc.mysql.url"), p.get("jdbc.mysql.user"), p.get("jdbc.mysql.password"));
+        druidPlugin.setConnectionProperties("useInformationSchema=true;remarks=true");
+        druidPlugin.start();
+        return druidPlugin.getDataSource();
+    }
+    
+    public static void main(final String[] args) {
+        //baseModel包名
+        String baseModelPackageName = "xgs.net.model.base";
+        //baseModel生成路劲
+        String baseModelOutputDir = PathKit.getWebRootPath() + "/src/main/java/xgs/net/model/base";
+        //model包名
+        String modelPackageName = "xgs.net.model";
+        //model生成路劲
+        String modelOutputDir = baseModelOutputDir + "/..";
+        //获取数据源
+        DataSource dataSource = getDataSource();
+
+        XgsModelGenerator modelGenerator = new XgsModelGenerator(modelPackageName, baseModelPackageName, modelOutputDir);
+        BaseModelGenerator baseModelGenerator = new BaseModelGenerator(baseModelPackageName, baseModelOutputDir);
+        Generator generator = new Generator(dataSource, baseModelGenerator, modelGenerator);
+        //设置数据库方言
+        generator.setDialect(new MysqlDialect());
+        generator.addExcludedTable("adv");
+        generator.setGenerateDaoInModel(true);
+        DataDictionaryGenerator dg = new MdDataDictionaryGenerator(dataSource, modelOutputDir);
+        dg.setDataDictionaryFileName("\u6570\u636e\u5b57\u5178.md");
+        generator.setDataDictionaryGenerator(dg);
+        generator.setGenerateDataDictionary(true);
+        generator.generate();
+    }
+}

+ 25 - 0
info_api/entity/src/main/java/xgs/net/entity/Item.java

@@ -0,0 +1,25 @@
+package xgs.net.entity;
+
+public class Item {
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Integer getNum() {
+        return num;
+    }
+
+    public void setNum(Integer num) {
+        this.num = num;
+    }
+
+    private Long id;
+    private Integer num;
+
+
+}

+ 41 - 0
info_api/entity/src/main/java/xgs/net/entity/OperaterEntity.java

@@ -0,0 +1,41 @@
+package xgs.net.entity;
+
+public class OperaterEntity
+{
+    private Long operateTime;
+    private String operateIp;
+    private Long operatorId;
+    private String operator;
+    
+    public Long getOperateTime() {
+        return this.operateTime;
+    }
+    
+    public void setOperateTime(final Long operateTime) {
+        this.operateTime = operateTime;
+    }
+    
+    public String getOperateIp() {
+        return this.operateIp;
+    }
+    
+    public void setOperateIp(final String operateIp) {
+        this.operateIp = operateIp;
+    }
+    
+    public Long getOperatorId() {
+        return this.operatorId;
+    }
+    
+    public void setOperatorId(final Long operatorId) {
+        this.operatorId = operatorId;
+    }
+    
+    public String getOperator() {
+        return this.operator;
+    }
+    
+    public void setOperator(final String operator) {
+        this.operator = operator;
+    }
+}

+ 0 - 0
info_api/entity/src/main/java/xgs/net/model/TbInfoList.java


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