周浩 9 rokov pred
rodič
commit
53345ed562
35 zmenil súbory, kde vykonal 839 pridanie a 126 odobranie
  1. 12 6
      hsweb-web-bean/src/main/java/org/hsweb/web/bean/common/QueryParam.java
  2. 10 30
      hsweb-web-bean/src/main/java/org/hsweb/web/bean/po/config/Config.java
  3. 141 0
      hsweb-web-bean/src/main/java/org/hsweb/web/bean/po/template/Template.java
  4. 9 7
      hsweb-web-bean/src/main/java/org/hsweb/web/bean/po/user/User.java
  5. 32 1
      hsweb-web-bean/src/main/resources/system/install/sql/h2/install.sql
  6. 20 0
      hsweb-web-bean/src/main/resources/system/install/sql/mysql/install.sql
  7. 30 0
      hsweb-web-bean/src/main/resources/system/install/sql/oracle/install.sql
  8. 10 6
      hsweb-web-controller/src/main/java/org/hsweb/web/controller/classified/ClassifiedController.java
  9. 32 22
      hsweb-web-controller/src/main/java/org/hsweb/web/controller/config/ConfigController.java
  10. 4 5
      hsweb-web-controller/src/main/java/org/hsweb/web/controller/form/DynamicFormController.java
  11. 25 0
      hsweb-web-controller/src/main/java/org/hsweb/web/controller/template/TemplateController.java
  12. 1 0
      hsweb-web-dao-impl-mybatis/src/main/java/org/hsweb/web/mybatis/builder/DefaultSqlParamBuilder.java
  13. 3 8
      hsweb-web-dao-impl-mybatis/src/main/java/org/hsweb/web/mybatis/handler/JsonArrayHandler.java
  14. 1 1
      hsweb-web-dao-impl-mybatis/src/main/resources/org/hsweb/web/dao/impl/mybatis/mapper/mysql/classified/ClassifiedMapper.xml
  15. 1 1
      hsweb-web-dao-impl-mybatis/src/main/resources/org/hsweb/web/dao/impl/mybatis/mapper/mysql/config/ConfigMapper.xml
  16. 1 1
      hsweb-web-dao-impl-mybatis/src/main/resources/org/hsweb/web/dao/impl/mybatis/mapper/oracle/classified/ClassifiedMapper.xml
  17. 1 3
      hsweb-web-dao-impl-mybatis/src/main/resources/org/hsweb/web/dao/impl/mybatis/mapper/oracle/config/ConfigMapper.xml
  18. 1 1
      hsweb-web-dao-impl-mybatis/src/main/resources/org/hsweb/web/dao/impl/mybatis/mapper/oracle/role/RoleModuleMapper.xml
  19. 122 0
      hsweb-web-dao-impl-mybatis/src/main/resources/org/hsweb/web/dao/impl/mybatis/mapper/oracle/template/TemplateMapper.xml
  20. 38 0
      hsweb-web-dao-interface/src/main/java/org/hsweb/web/dao/template/TemplateMapper.java
  21. 6 1
      hsweb-web-service-impl-common/src/main/java/org/hsweb/web/service/impl/AbstractServiceImpl.java
  22. 11 2
      hsweb-web-service-impl-common/src/main/java/org/hsweb/web/service/impl/config/ConfigServiceImpl.java
  23. 17 15
      hsweb-web-service-impl-common/src/main/java/org/hsweb/web/service/impl/form/DefaultFormParser.java
  24. 6 0
      hsweb-web-service-impl-common/src/main/java/org/hsweb/web/service/impl/form/DynamicFormServiceImpl.java
  25. 163 0
      hsweb-web-service-impl-common/src/main/java/org/hsweb/web/service/impl/template/TemplateServiceImpl.java
  26. 3 3
      hsweb-web-service-impl-common/src/main/java/org/hsweb/web/service/impl/user/UserServiceImpl.java
  27. 3 10
      hsweb-web-service-impl-common/src/test/java/org/hsweb/web/service/impl/system/DataBaseManagerServiceImplTest.java
  28. 81 0
      hsweb-web-service-impl-common/src/test/java/org/hsweb/web/service/impl/template/TemplateServiceImplTest.java
  29. 1 1
      hsweb-web-service-impl-common/src/test/resources/application.yml
  30. 3 0
      hsweb-web-service-impl-common/src/test/resources/mybatis-config.xml
  31. 31 0
      hsweb-web-service-interface/src/main/java/org/hsweb/web/service/template/TemplateService.java
  32. 0 1
      hsweb-web-websocket/pom.xml
  33. 1 0
      hsweb-web-websocket/src/main/java/org/hsweb/web/socket/CmdWebSocketHandler.java
  34. 1 1
      hsweb-web-websocket/src/test/java/org/hsweb/web/socket/WebSocketClientTest.java
  35. 18 0
      pom.xml

+ 12 - 6
hsweb-web-bean/src/main/java/org/hsweb/web/bean/common/QueryParam.java

@@ -1,8 +1,8 @@
 package org.hsweb.web.bean.common;
 
 import java.io.Serializable;
-import java.util.LinkedHashSet;
-import java.util.Set;
+import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * Created by 浩 on 2016-01-16 0016.
@@ -34,7 +34,7 @@ public class QueryParam extends SqlParam<QueryParam> implements Serializable {
     /**
      * 排序字段
      */
-    private Set<Sort> sorts = new LinkedHashSet<>();
+    private List<Sort> sorts = new LinkedList<>();
 
     /**
      * 排序方式 DESC 反序 ASC 正序
@@ -58,6 +58,11 @@ public class QueryParam extends SqlParam<QueryParam> implements Serializable {
         return this;
     }
 
+    public QueryParam noPaging() {
+        this.paging = false;
+        return this;
+    }
+
     public QueryParam doPaging(int pageIndex, int pageSize) {
         this.pageIndex = pageIndex;
         this.pageSize = pageSize;
@@ -121,11 +126,12 @@ public class QueryParam extends SqlParam<QueryParam> implements Serializable {
         return new QueryParam();
     }
 
-    public Set<Sort> getSorts() {
-        return sorts;
+    public List<Sort> getSorts() {
+        return  sorts;
     }
 
-    public void setSorts(Set<Sort> sorts) {
+    public void setSorts(List<Sort> sorts) {
         this.sorts = sorts;
     }
+
 }

+ 10 - 30
hsweb-web-bean/src/main/java/org/hsweb/web/bean/po/config/Config.java

@@ -27,9 +27,6 @@ public class Config extends GenericPo<String> {
     //最后一次修改日期
     private java.util.Date updateDate;
 
-    //配置类型: properties,json
-    private String type;
-
     //配置分类ID
     private String classifiedId;
 
@@ -101,13 +98,6 @@ public class Config extends GenericPo<String> {
         this.updateDate = updateDate;
     }
 
-    public String getType() {
-        return type;
-    }
-
-    public void setType(String type) {
-        this.type = type;
-    }
 
     public String getClassifiedId() {
         return classifiedId;
@@ -118,26 +108,16 @@ public class Config extends GenericPo<String> {
     }
 
     public Map<Object, Object> toMap() {
-        switch (type) {
-            case "properties":
-                Properties properties = new Properties();
-                try {
-                    properties.load(new StringReader(getContent()));
-                } catch (IOException e) {
-                }
-                return properties;
-            case "json":
-                if (getContent().trim().startsWith("[")) {
-                    Map<Object, Object> map = new LinkedHashMap<>();
-                    List<Map> arr = JSON.parseArray(getContent(), Map.class);
-                    for (int i = 0; i < arr.size(); i++) {
-                        map.put(String.valueOf(i), arr.get(i));
-                    }
-                    return map;
-                }
-                return JSON.parseObject(getContent(), Map.class);
-            default:
-                return new HashMap<>();
+        if (getContent().trim().startsWith("{")) {
+            return JSON.parseObject(getContent(), Map.class);
         }
+        Map<Object, Object> data = new LinkedHashMap<>();
+        toList().forEach(map -> data.put(map.get("key"), map.get("value")));
+        return data;
+    }
+
+    public List<Map<Object, Object>> toList() {
+        List<Map<Object, Object>> array = (List) JSON.parseArray(getContent(), Map.class);
+        return array;
     }
 }

+ 141 - 0
hsweb-web-bean/src/main/java/org/hsweb/web/bean/po/template/Template.java

@@ -0,0 +1,141 @@
+package org.hsweb.web.bean.po.template;
+
+import org.hsweb.web.bean.po.GenericPo;
+
+import java.util.List;
+
+/**
+ * Created by zhouhao on 16-5-19.
+ */
+public class Template extends GenericPo<String> {
+
+    private String name;
+
+    private String remark;
+
+    private String template;
+
+    private String classifiedId;
+
+    private String type;
+
+    private String script;
+
+    private String css;
+
+    private List<String> cssLinks;
+
+    private List<String> scriptLinks;
+
+    private int version;
+
+    private int revision;
+
+    private int release;
+
+    private boolean using;
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public String getTemplate() {
+        return template;
+    }
+
+    public void setTemplate(String template) {
+        this.template = template;
+    }
+
+    public String getClassifiedId() {
+        return classifiedId;
+    }
+
+    public void setClassifiedId(String classifiedId) {
+        this.classifiedId = classifiedId;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public String getScript() {
+        return script;
+    }
+
+    public void setScript(String script) {
+        this.script = script;
+    }
+
+    public String getCss() {
+        return css;
+    }
+
+    public void setCss(String css) {
+        this.css = css;
+    }
+
+    public List<String> getCssLinks() {
+        return cssLinks;
+    }
+
+    public void setCssLinks(List<String> cssLinks) {
+        this.cssLinks = cssLinks;
+    }
+
+    public List<String> getScriptLinks() {
+        return scriptLinks;
+    }
+
+    public void setScriptLinks(List<String> scriptLinks) {
+        this.scriptLinks = scriptLinks;
+    }
+
+    public int getVersion() {
+        return version;
+    }
+
+    public void setVersion(int version) {
+        this.version = version;
+    }
+
+    public int getRevision() {
+        return revision;
+    }
+
+    public void setRevision(int revision) {
+        this.revision = revision;
+    }
+
+    public int getRelease() {
+        return release;
+    }
+
+    public void setRelease(int release) {
+        this.release = release;
+    }
+
+    public boolean isUsing() {
+        return using;
+    }
+
+    public void setUsing(boolean using) {
+        this.using = using;
+    }
+}

+ 9 - 7
hsweb-web-bean/src/main/java/org/hsweb/web/bean/po/user/User.java

@@ -108,18 +108,20 @@ public class User extends GenericPo<String> {
 
     public boolean hasAccessRole(String rId) {
         if (getUserRoles() != null)
-            for (UserRole userRole : getUserRoles()) {
-                if (rId.equals(userRole.getRoleId())) return true;
-            }
+            return getUserRoles().stream().anyMatch(userRole -> userRole.getRoleId().equals(rId));
+//            for (UserRole userRole : getUserRoles()) {
+//                if (rId.equals(userRole.getRoleId())) return true;
+//            }
         return false;
     }
 
     public boolean hasAccessModule(String mId) {
         if (roleInfo == null) initRoleInfo();
-        for (Module module : roleInfo.keySet()) {
-            if (module.getId().equals(mId)) return true;
-        }
-        return false;
+        return roleInfo.keySet().stream().anyMatch(mdl -> mdl.getId().equals(mId));
+//        for (Module module : roleInfo.keySet()) {
+//            if (module.getId().equals(mId)) return true;
+//        }
+//        return false;
     }
 
     /**

+ 32 - 1
hsweb-web-bean/src/main/resources/system/install/sql/h2/install.sql

@@ -21,7 +21,7 @@ COMMENT ON COLUMN "S_CONFIG"."UPDATE_DATE" IS '修改日期';
 -- Table structure for S_FORM
 -- ----------------------------
 CREATE TABLE "S_FORM" (
-  "U_ID"        VARCHAR2(256) NOT NULL,
+  "U_ID"        VARCHAR2(32)  NOT NULL,
   "NAME"        VARCHAR2(256) NOT NULL,
   "HTML"        CLOB          NULL,
   "META"        CLOB          NULL,
@@ -46,6 +46,37 @@ COMMENT ON COLUMN "S_FORM"."USING" IS '是否使用中';
 COMMENT ON COLUMN "S_FORM"."CREATE_DATE" IS '创建日期';
 COMMENT ON COLUMN "S_FORM"."UPDATE_DATE" IS '修改日期';
 
+
+CREATE TABLE "S_TEMPLATE" (
+  "U_ID"          VARCHAR2(32)  NOT NULL,
+  "NAME"          VARCHAR2(256) NOT NULL,
+  "TEMPLATE"      CLOB          NULL,
+  "CLASSIFIED_ID" VARCHAR2(32)  NULL,
+  "TYPE"          VARCHAR2(64)  NULL,
+  "SCRIPT"        CLOB          NULL,
+  "CSS"           CLOB          NULL,
+  "CSS_LINKS"     CLOB          NULL,
+  "SCRIPT_LINKS"  CLOB          NULL,
+  "VERSION"       NUMBER(32)    NULL,
+  "REVISION"      NUMBER(32)    NULL,
+  "RELEASE"       NUMBER(32)    NULL,
+  "USING"         NUMBER(4)     NULL,
+  "REMARK"        VARCHAR2(200) NULL
+);
+COMMENT ON COLUMN "S_TEMPLATE"."U_ID" IS 'UID';
+COMMENT ON COLUMN "S_TEMPLATE"."NAME" IS '名称';
+COMMENT ON COLUMN "S_TEMPLATE"."TEMPLATE" IS '模板';
+COMMENT ON COLUMN "S_TEMPLATE"."CLASSIFIED_ID" IS '分类';
+COMMENT ON COLUMN "S_TEMPLATE"."TYPE" IS '类型';
+COMMENT ON COLUMN "S_TEMPLATE"."SCRIPT" IS '脚本';
+COMMENT ON COLUMN "S_TEMPLATE"."CSS" IS '样式';
+COMMENT ON COLUMN "S_TEMPLATE"."CSS_LINKS" IS '样式链接';
+COMMENT ON COLUMN "S_TEMPLATE"."SCRIPT_LINKS" IS '脚本链接';
+COMMENT ON COLUMN "S_TEMPLATE"."VERSION" IS '版本';
+COMMENT ON COLUMN "S_TEMPLATE"."REVISION" IS '修订版';
+COMMENT ON COLUMN "S_TEMPLATE"."RELEASE" IS '当前发布版本';
+COMMENT ON COLUMN "S_TEMPLATE"."USING" IS '是否使用中';
+
 -- ----------------------------
 -- Table structure for S_LOGGER
 -- ----------------------------

+ 20 - 0
hsweb-web-bean/src/main/resources/system/install/sql/mysql/install.sql

@@ -39,6 +39,26 @@ CREATE TABLE `s_form` (
 );
 ALTER TABLE `s_form` COMMENT '动态表单';
 
+CREATE TABLE `s_template` (
+  `u_id`          VARCHAR(32)  NOT NULL PRIMARY KEY
+  COMMENT 'uid',
+  `name`          VARCHAR(256) NOT NULL
+  COMMENT '名称',
+  `template`      TEXT COMMENT '模板内容',
+  `classified_id` VARCHAR(32) COMMENT '分类',
+  `type`          VARCHAR(64) COMMENT '类型',
+  `script`        TEXT COMMENT '脚本',
+  `script_links`  TEXT COMMENT '外部脚本',
+  `css`           TEXT COMMENT '样式',
+  `css_links`     TEXT COMMENT '外部样式',
+  `version`       INT COMMENT '版本',
+  `revision`      INT COMMENT '修订版',
+  `release`       INT COMMENT '发布版',
+  `using`         TINYINT COMMENT '是否使用中',
+  `remark`        VARCHAR(200)
+);
+ALTER TABLE `s_template` COMMENT '模板';
+
 
 -- ----------------------------
 -- Table structure for S_MODULES

+ 30 - 0
hsweb-web-bean/src/main/resources/system/install/sql/oracle/install.sql

@@ -46,6 +46,36 @@ COMMENT ON COLUMN ${jdbc.username}."S_FORM"."USING" IS '是否使用中';
 COMMENT ON COLUMN ${jdbc.username}."S_FORM"."CREATE_DATE" IS '创建日期';
 COMMENT ON COLUMN ${jdbc.username}."S_FORM"."UPDATE_DATE" IS '修改日期';
 
+
+CREATE TABLE ${jdbc.username}."S_TEMPLATE" (
+  "U_ID"          VARCHAR2(32)  NOT NULL,
+  "NAME"          VARCHAR2(256) NOT NULL,
+  "TEMPLATE"      CLOB          NULL,
+  "CLASSIFIED_ID" VARCHAR2(32)  NULL,
+  "TYPE"          VARCHAR2(64)  NULL,
+  "SCRIPT"        CLOB          NULL,
+  "CSS"           CLOB          NULL,
+  "CSS_LINKS"     CLOB          NULL,
+  "SCRIPT_LINKS"  CLOB          NULL,
+  "VERSION"       NUMBER(32)    NULL,
+  "REVISION"      NUMBER(32)    NULL,
+  "RELEASE"       NUMBER(32)    NULL,
+  "USING"         NUMBER(4)     NULL,
+  "REMARK"        VARCHAR2(200) NULL
+);
+COMMENT ON COLUMN ${jdbc.username}."S_TEMPLATE"."U_ID" IS 'UID';
+COMMENT ON COLUMN ${jdbc.username}."S_TEMPLATE"."NAME" IS '名称';
+COMMENT ON COLUMN ${jdbc.username}."S_TEMPLATE"."TEMPLATE" IS '模板';
+COMMENT ON COLUMN ${jdbc.username}."S_TEMPLATE"."CLASSIFIED_ID" IS '分类';
+COMMENT ON COLUMN ${jdbc.username}."S_TEMPLATE"."TYPE" IS '类型';
+COMMENT ON COLUMN ${jdbc.username}."S_TEMPLATE"."SCRIPT" IS '脚本';
+COMMENT ON COLUMN ${jdbc.username}."S_TEMPLATE"."CSS" IS '样式';
+COMMENT ON COLUMN ${jdbc.username}."S_TEMPLATE"."CSS_LINKS" IS '样式链接';
+COMMENT ON COLUMN ${jdbc.username}."S_TEMPLATE"."SCRIPT_LINKS" IS '脚本链接';
+COMMENT ON COLUMN ${jdbc.username}."S_TEMPLATE"."VERSION" IS '版本';
+COMMENT ON COLUMN ${jdbc.username}."S_TEMPLATE"."REVISION" IS '修订版';
+COMMENT ON COLUMN ${jdbc.username}."S_TEMPLATE"."RELEASE" IS '当前发布版本';
+COMMENT ON COLUMN ${jdbc.username}."S_TEMPLATE"."USING" IS '是否使用中';
 -- ----------------------------
 -- Table structure for S_LOGGER
 -- ----------------------------

+ 10 - 6
hsweb-web-controller/src/main/java/org/hsweb/web/controller/classified/ClassifiedController.java

@@ -1,30 +1,34 @@
 package org.hsweb.web.controller.classified;
 
+import org.hsweb.web.bean.common.QueryParam;
 import org.hsweb.web.bean.po.classified.Classified;
 import org.hsweb.web.controller.GenericController;
 import org.hsweb.web.core.authorize.annotation.Authorize;
+import org.hsweb.web.core.message.ResponseMessage;
 import org.hsweb.web.service.classified.ClassifiedService;
+import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
 
-/**
-* 控制器,继承自GenericController,使用rest+json
-* Created by hsweb-generator 2016-5-14 10:18:41
-*/
 @RestController
 @RequestMapping(value = "/classified")
 @Authorize(module = "classified")
-public class ClassifiedController extends GenericController<Classified,String> {
+public class ClassifiedController extends GenericController<Classified, String> {
 
     //默认服务类
     @Resource
     private ClassifiedService classifiedService;
 
     @Override
-    public ClassifiedService getService(){
+    public ClassifiedService getService() {
         return this.classifiedService;
     }
 
+    @RequestMapping(value = "/byType/{type}")
+    public ResponseMessage listByType(@PathVariable("type") String type, QueryParam param) throws Exception {
+        param.where("type", type);
+        return list(param);
+    }
 }

+ 32 - 22
hsweb-web-controller/src/main/java/org/hsweb/web/controller/config/ConfigController.java

@@ -40,34 +40,34 @@ public class ConfigController extends GenericController<Config, String> {
      * 批量获取缓存,如传入["core.system.version","upload.path"] 将获取core中的system.version属性和upload中的path属性
      * <br/>并返回结果如: {"core":{"system.version":"1.0"},"upload":{"path":"/files"}}
      *
-     * @param resources 请求获取的配置列表
+     * @param ids 请求获取的配置列表
      * @return 配置内容
      */
     @RequestMapping(value = "/info", method = RequestMethod.GET)
-    @Cacheable(value = CACHE_KEY, key = "'info_list'+#resources.hashCode()")
+    @Cacheable(value = CACHE_KEY, key = "'info_list'+#ids.hashCode()")
     @AccessLogger("批量获取配置")
-    public Object batch(@RequestParam(value = "resources", defaultValue = "[]") String resources) {
-        List<String> requestData = JSON.parseArray(resources, String.class);
+    public Object batch(@RequestParam(value = "ids", defaultValue = "[]") String ids, boolean map) {
+        List<String> requestData = JSON.parseArray(ids, String.class);
         //获取缓存里的配置
         Map<String, Object> config = new LinkedHashMap<>();
         //临时缓存,用于当进行如: cfg.name,cfg.data,cfg.other。等获取时,cfg只获取一次,提升效率
         Map<String, Map<String, String>> temp = new LinkedHashMap<>();
         for (String request : requestData) {
+            Config conf = null;
+            try {
+                conf = configService.selectByPk(request);
+            } catch (Exception e) {
+            }
             //如果包含[.],则代表是获取当个配置属性。如: core.system.version,将获取core配置中的system.version属性
-            if (request.contains(".")) {
-                String[] res = request.split("[.]");
-                if (res.length > 2) {
-                    for (int i = 2; i < res.length; i++) {
-                        res[1] = res[1].concat(".").concat(res[i]);
-                    }
-                }
+            if (conf == null && request.contains(".")) {
+                String[] res = request.split("[.]", 2);
                 String name = res[0]; //如: core
                 String key = res[1]; //如: system.version
                 Map cache;
                 //获取临时缓存中的配置
                 if ((cache = temp.get(name)) == null) {
                     try {
-                        Config conf = configService.selectByPk(name);
+                        conf = configService.selectByPk(name);
                         cache = conf.toMap();
                     } catch (Exception e) {
                     }
@@ -87,13 +87,8 @@ public class ConfigController extends GenericController<Config, String> {
                 }
             } else {
                 //获取完整配置
-                Config conf = null;
-                try {
-                    conf = configService.selectByPk(request);
-                } catch (Exception e) {
-                }
                 if (conf != null) {
-                    config.put(request, conf.toMap());
+                    config.put(request, map ? conf.toMap() : conf.toList());
                 }
             }
         }
@@ -107,12 +102,19 @@ public class ConfigController extends GenericController<Config, String> {
      * @param name 配置名称
      * @return 配置内容
      */
-    @RequestMapping(value = "/info/{name:.+}", method = RequestMethod.GET)
-    @AccessLogger("根据配置名获取配置")
+    @RequestMapping(value = "/{name:.+}.map", method = RequestMethod.GET)
+    @AccessLogger("根据配置名获取配置(map格式)")
     public Object configInfo(@PathVariable("name") String name) throws Exception {
         return configService.get(name);
     }
 
+    @RequestMapping(value = "/{name:.+}.array", method = RequestMethod.GET)
+    @AccessLogger("根据配置名获取配置(list格式)")
+    public Object listInfo(@PathVariable("name") String name) throws Exception {
+        String content = configService.getContent(name);
+        if (content == null) content = "[]";
+        return content;
+    }
 
     /**
      * 获取一个配置中的某个属性
@@ -121,10 +123,10 @@ public class ConfigController extends GenericController<Config, String> {
      * @param key  配置属性,支持.,如 system.version
      * @return 配置内容
      */
-    @RequestMapping(value = {"/info/{name:.+}/{key:.+}"}, method = RequestMethod.GET)
+    @RequestMapping(value = {"/{name:.+}/{key:.+}"}, method = RequestMethod.GET)
     @AccessLogger("根据配置名和键获取配置")
     public Object configInfo(@PathVariable("name") String name, @PathVariable("key") String key) throws Exception {
-        return configService.get(name, key,"");
+        return configService.get(name, key, "");
     }
 
     @Override
@@ -139,8 +141,16 @@ public class ConfigController extends GenericController<Config, String> {
         return super.add(object);
     }
 
+    @Override
+    @Authorize(module = "config", action = "D")
+    @RequestMapping(value = "/{id:.+}", method = RequestMethod.DELETE)
+    public ResponseMessage delete(@PathVariable("id") String id) throws Exception {
+        return super.delete(id);
+    }
+
     @Override
     @Authorize(module = "config", action = "U")
+    @RequestMapping(value = "/{id:.+}", method = RequestMethod.PUT)
     public ResponseMessage update(@PathVariable("id") String id, @RequestBody Config object) throws Exception {
         return super.update(id, object);
     }

+ 4 - 5
hsweb-web-controller/src/main/java/org/hsweb/web/controller/form/DynamicFormController.java

@@ -1,14 +1,13 @@
 package org.hsweb.web.controller.form;
 
-import org.hsweb.web.core.authorize.annotation.Authorize;
 import org.hsweb.web.bean.common.InsertMapParam;
 import org.hsweb.web.bean.common.QueryParam;
 import org.hsweb.web.bean.common.UpdateMapParam;
+import org.hsweb.web.core.authorize.annotation.Authorize;
 import org.hsweb.web.core.logger.annotation.AccessLogger;
 import org.hsweb.web.core.message.ResponseMessage;
 import org.hsweb.web.service.form.DynamicFormService;
 import org.hsweb.web.service.resource.FileService;
-import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
@@ -88,9 +87,9 @@ public class DynamicFormController {
     @AccessLogger("导出excel")
     @Authorize(expression = "#dynamicFormAuthorizeValidator.validate(#name,#user,'export')")
     public void exportExcel(@PathVariable("name") String name,
-                                       @PathVariable("fileName") String fileName,
-                                       QueryParam queryParam,
-                                       HttpServletResponse response) throws Exception {
+                            @PathVariable("fileName") String fileName,
+                            QueryParam queryParam,
+                            HttpServletResponse response) throws Exception {
         response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode(fileName, "utf-8"));
         response.setContentType("application/vnd.ms-excel");
         dynamicFormService.exportExcel(name, queryParam, response.getOutputStream());

+ 25 - 0
hsweb-web-controller/src/main/java/org/hsweb/web/controller/template/TemplateController.java

@@ -0,0 +1,25 @@
+package org.hsweb.web.controller.template;
+
+import org.hsweb.web.bean.po.template.Template;
+import org.hsweb.web.controller.GenericController;
+import org.hsweb.web.service.template.TemplateService;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+/**
+ * Created by zhouhao on 16-5-23.
+ */
+@RestController
+@RequestMapping("/template")
+public class TemplateController extends GenericController<Template, String> {
+    @Resource
+    private TemplateService templateService;
+
+    @Override
+    protected TemplateService getService() {
+        return templateService;
+    }
+
+}

+ 1 - 0
hsweb-web-dao-impl-mybatis/src/main/java/org/hsweb/web/mybatis/builder/DefaultSqlParamBuilder.java

@@ -327,6 +327,7 @@ public class DefaultSqlParamBuilder {
 
     protected Object transformationValue(JDBCType type, Object value) {
         switch (type) {
+            case INTEGER:
             case NUMERIC:
                 if (StringUtils.isInt(type)) return StringUtils.toInt(value);
                 if (StringUtils.isDouble(type)) return StringUtils.toDouble(value);

+ 3 - 8
hsweb-web-dao-impl-mybatis/src/main/java/org/hsweb/web/mybatis/handler/JsonArrayHandler.java

@@ -1,15 +1,9 @@
 package org.hsweb.web.mybatis.handler;
 
 import com.alibaba.fastjson.JSON;
-import org.apache.ibatis.type.Alias;
-import org.apache.ibatis.type.BaseTypeHandler;
-import org.apache.ibatis.type.JdbcType;
-import org.apache.ibatis.type.MappedTypes;
+import org.apache.ibatis.type.*;
 
-import java.sql.CallableStatement;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
+import java.sql.*;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -18,6 +12,7 @@ import java.util.List;
  */
 @Alias("jsonArrayHandler")
 @MappedTypes({List.class})
+@MappedJdbcTypes({JdbcType.VARCHAR, JdbcType.CLOB})
 public class JsonArrayHandler extends BaseTypeHandler<List<Object>> {
 
     @Override

+ 1 - 1
hsweb-web-dao-impl-mybatis/src/main/resources/org/hsweb/web/dao/impl/mybatis/mapper/mysql/classified/ClassifiedMapper.xml

@@ -26,7 +26,7 @@
                     ,'parent_id':#{'property':'parentId','jdbcType':'VARCHAR','javaType':'String'}
                     ,'icon':#{'jdbcType':'VARCHAR','javaType':'String'}
                     ,'config':#{'jdbcType':'CLOB','javaType':'String'}
-                    ,'sort_index':#{'jdbcType':'INTEGER','javaType':'int'}
+                    ,'sort_index':#{'property':'sortIndex','jdbcType':'INTEGER','javaType':'int'}
                     }"/>
 
         <bind name="$fields" value="$fieldsInfo.keySet()"/>

+ 1 - 1
hsweb-web-dao-impl-mybatis/src/main/resources/org/hsweb/web/dao/impl/mybatis/mapper/mysql/config/ConfigMapper.xml

@@ -23,7 +23,7 @@
                     ,'create_date':#{'property':'createDate','jdbcType':'TIMESTAMP','javaType':'date'}
                     ,'update_date':#{'property':'updateDate','jdbcType':'TIMESTAMP','javaType':'date'}
                      ,'type':#{'jdbcType':'VARCHAR','javaType':'string'}
-                     ,classified_id':#{'property':'classifiedId','jdbcType':'VARCHAR','javaType':'string'}
+                     ,'classified_id':#{'property':'classifiedId','jdbcType':'VARCHAR','javaType':'string'}
                     }"/>
 
         <bind name="$fields" value="$fieldsInfo.keySet()"/>

+ 1 - 1
hsweb-web-dao-impl-mybatis/src/main/resources/org/hsweb/web/dao/impl/mybatis/mapper/oracle/classified/ClassifiedMapper.xml

@@ -26,7 +26,7 @@
                     ,'parent_id':#{'property':'parentId','jdbcType':'VARCHAR','javaType':'String'}
                     ,'icon':#{'jdbcType':'VARCHAR','javaType':'String'}
                     ,'config':#{'jdbcType':'CLOB','javaType':'String'}
-                    ,'sort_index':#{'jdbcType':'INTEGER','javaType':'int'}
+                    ,'sort_index':#{'property':'sortIndex','jdbcType':'INTEGER','javaType':'int'}
                     }"/>
 
         <bind name="$fields" value="$fieldsInfo.keySet()"/>

+ 1 - 3
hsweb-web-dao-impl-mybatis/src/main/resources/org/hsweb/web/dao/impl/mybatis/mapper/oracle/config/ConfigMapper.xml

@@ -9,7 +9,6 @@
         <result property="remark" column="remark" javaType="String" jdbcType="VARCHAR"/>
         <result property="content" column="content" javaType="String" jdbcType="VARCHAR"/>
         <result property="createDate" column="create_date" javaType="java.util.Date" jdbcType="TIMESTAMP"/>
-        <result property="type" column="type" javaType="String" jdbcType="VARCHAR"/>
         <result property="classifiedId" column="classified_id" javaType="String" jdbcType="VARCHAR"/>
     </resultMap>
 
@@ -22,8 +21,7 @@
                     ,'content':#{'jdbcType':'VARCHAR','javaType':'string'}
                     ,'create_date':#{'property':'createDate','jdbcType':'TIMESTAMP','javaType':'date'}
                     ,'update_date':#{'property':'updateDate','jdbcType':'TIMESTAMP','javaType':'date'}
-                     ,'type':#{'jdbcType':'VARCHAR','javaType':'string'}
-                     ,classified_id':#{'property':'classifiedId','jdbcType':'VARCHAR','javaType':'string'}
+                    ,'classified_id':#{'property':'classifiedId','jdbcType':'VARCHAR','javaType':'string'}
                     }"/>
         <bind name="$fields" value="$fieldsInfo.keySet()"/>
     </sql>

+ 1 - 1
hsweb-web-dao-impl-mybatis/src/main/resources/org/hsweb/web/dao/impl/mybatis/mapper/oracle/role/RoleModuleMapper.xml

@@ -8,7 +8,7 @@
         <id property="id" column="u_id" javaType="string" jdbcType="VARCHAR" />
         <result property="moduleId" column="module_id" javaType="String" jdbcType="VARCHAR" />
         <result property="roleId" column="role_id" javaType="String" jdbcType="VARCHAR" />
-        <result property="actions" column="actions" javaType="String" jdbcType="VARCHAR"
+        <result property="actions" column="actions" javaType="java.util.List" jdbcType="VARCHAR"
                 typeHandler="org.hsweb.web.mybatis.handler.JsonArrayHandler" />
         <collection property="module" column="module_id" ofType="Module" select="org.hsweb.web.dao.module.ModuleMapper.selectByPk"/>
     </resultMap>

+ 122 - 0
hsweb-web-dao-impl-mybatis/src/main/resources/org/hsweb/web/dao/impl/mybatis/mapper/oracle/template/TemplateMapper.xml

@@ -0,0 +1,122 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://www.mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="org.hsweb.web.dao.template.TemplateMapper">
+    <resultMap id="TemplateResultMap" type="Template">
+        <id property="id" column="u_id" javaType="string" jdbcType="VARCHAR"/>
+        <result property="name" column="name" javaType="String" jdbcType="VARCHAR"/>
+        <result property="remark" column="remark" javaType="String" jdbcType="VARCHAR"/>
+        <result property="template" column="template" javaType="String" jdbcType="CLOB"/>
+        <result property="classifiedId" column="classified_id" javaType="String" jdbcType="VARCHAR"/>
+        <result property="type" column="type" javaType="String" jdbcType="VARCHAR"/>
+        <result property="script" column="script" javaType="String" jdbcType="CLOB"/>
+        <result property="css" column="css" javaType="String" jdbcType="CLOB"/>
+        <result property="cssLinks" column="css_links" javaType="java.util.List" jdbcType="CLOB"
+                typeHandler="org.hsweb.web.mybatis.handler.JsonArrayHandler"/>
+        <result property="scriptLinks" column="script_links" javaType="java.util.List" jdbcType="CLOB"
+                typeHandler="org.hsweb.web.mybatis.handler.JsonArrayHandler"/>
+        <result property="version" column="version" javaType="int" jdbcType="INTEGER"/>
+        <result property="revision" column="revision" javaType="int" jdbcType="INTEGER"/>
+        <result property="release" column="release" javaType="int" jdbcType="INTEGER"/>
+        <result property="using" column="using" javaType="boolean" jdbcType="INTEGER"/>
+    </resultMap>
+
+    <!--字段信息绑定-->
+    <sql id="fieldConfig">
+        <bind name="$fieldsInfo"
+              value="#{
+                    'u_id':#{'property':'id','jdbcType':'VARCHAR','javaType':'string'}
+                    ,'name':#{'jdbcType':'VARCHAR','javaType':'string'}
+                    ,'remark':#{'jdbcType':'VARCHAR','javaType':'string'}
+                    ,'template':#{'jdbcType':'VARCHAR','javaType':'string'}
+                    ,'classified_id':#{'property':'classifiedId','jdbcType':'VARCHAR','javaType':'string'}
+                    ,'type':#{'jdbcType':'VARCHAR','javaType':'string'}
+                    ,'script':#{'jdbcType':'VARCHAR','javaType':'string'}
+                    ,'css':#{'jdbcType':'VARCHAR','javaType':'string'}
+                    ,'css_links':#{'property':'cssLinks','jdbcType':'CLOB','javaType':'java.util.List'}
+                    ,'script_links':#{'property':'scriptLinks','jdbcType':'CLOB','javaType':'java.util.List'}
+                    ,'version':#{'jdbcType':'INTEGER','javaType':'int'}
+                    ,'revision':#{'jdbcType':'INTEGER','javaType':'int'}
+                    ,'release':#{'jdbcType':'INTEGER','javaType':'int'}
+                    ,'using':#{'jdbcType':'INTEGER','javaType':'boolean'}
+                    }"/>
+
+        <bind name="$fields" value="$fieldsInfo.keySet()"/>
+    </sql>
+
+    <!--表名-->
+    <sql id="tableName">
+        <bind name="$tableName" value="'s_template'"/>
+    </sql>
+
+    <insert id="insert" parameterType="org.hsweb.web.bean.common.InsertParam" useGeneratedKeys="true" keyProperty="data.id" keyColumn="U_ID">
+        <include refid="fieldConfig"/>
+        <include refid="tableName"/>
+        <include refid="BasicMapper.buildInsertSql"/>
+    </insert>
+
+    <delete id="delete" parameterType="org.hsweb.web.bean.common.DeleteParam">
+        delete from s_template where u_id=#{term.primaryKey}
+    </delete>
+
+    <update id="update" parameterType="org.hsweb.web.bean.common.UpdateParam">
+        <include refid="fieldConfig"/>
+        <include refid="tableName"/>
+        <include refid="BasicMapper.buildUpdateSql"/>
+    </update>
+
+    <select id="selectByPk" parameterType="string" resultMap="TemplateResultMap">
+        select * from s_template WHERE u_id=#{id}
+    </select>
+
+    <select id="selectUsing" parameterType="string" resultMap="TemplateResultMap">
+        select * from s_template WHERE using=1 and name=#{name}
+    </select>
+
+    <select id="selectLatestList" parameterType="org.hsweb.web.bean.common.QueryParam" resultMap="TemplateResultMap">
+        <include refid="fieldConfig"/>
+        <!--定义字段配置-->
+        <bind name="$tableName" value="'t2'"/>
+        <!--定义表名-->
+        select
+        <!--动态生成要查询的字段-->
+        <include refid="BasicMapper.buildSelectField"/>
+        from (
+        select s_template.name,max(s_template.version) as version from s_template s_template
+        <include refid="tableName"/>
+        <where>
+            <!--动态查询条件-->
+            <include refid="BasicMapper.buildWhere"/>
+        </where>
+        group by name) t1
+        left join s_form t2 on t1.name=t2.name and t1.version =t2.version
+        <bind name="$tableName" value="'t2'"/>
+        <include refid="BasicMapper.buildSortField"/>
+    </select>
+
+    <select id="countLatestList" parameterType="org.hsweb.web.bean.common.QueryParam" resultType="int">
+        <include refid="fieldConfig"/>
+        <include refid="tableName"/>
+        select count(0) as total from (
+        select s_template.name,max(s_form.version) as version from s_template s_template
+        <where>
+            <include refid="BasicMapper.buildWhere"/>
+        </where>
+        group by name) t1
+        left join s_template t2 on t1.name=t2.name and t1.version =t2.version
+    </select>
+
+    <select id="select" parameterType="org.hsweb.web.bean.common.QueryParam" resultMap="TemplateResultMap">
+        <include refid="fieldConfig"/>
+        <include refid="tableName"/>
+        <include refid="BasicMapper.buildSelectSql"/>
+    </select>
+
+    <select id="total" parameterType="org.hsweb.web.bean.common.QueryParam" resultType="int">
+        <include refid="fieldConfig"/>
+        <include refid="tableName"/>
+        <include refid="BasicMapper.buildTotalSql"/>
+    </select>
+</mapper>

+ 38 - 0
hsweb-web-dao-interface/src/main/java/org/hsweb/web/dao/template/TemplateMapper.java

@@ -0,0 +1,38 @@
+package org.hsweb.web.dao.template;
+
+import org.hsweb.web.bean.common.QueryParam;
+import org.hsweb.web.bean.po.template.Template;
+import org.hsweb.web.dao.GenericMapper;
+
+import java.util.List;
+
+/**
+ * Created by zhouhao on 16-5-20.
+ */
+public interface TemplateMapper extends GenericMapper<Template, String> {
+    /**
+     * 查看当前正在使用的模板
+     *
+     * @param name 模板名字
+     * @return 模板对象
+     * @throws Exception
+     */
+    Template selectUsing(String name) throws Exception;
+
+    /**
+     * 查询最新版本的模板列表
+     *
+     * @param param 查询参数
+     * @return 模板列表
+     */
+    List<Template> selectLatestList(QueryParam param) throws Exception;
+
+    /**
+     * 查询最新版本的模板数量
+     *
+     * @param param 查询参数
+     * @return 模板数量
+     */
+    int countLatestList(QueryParam param) throws Exception;
+
+}

+ 6 - 1
hsweb-web-service-impl-common/src/main/java/org/hsweb/web/service/impl/AbstractServiceImpl.java

@@ -3,6 +3,7 @@ package org.hsweb.web.service.impl;
 import org.hsweb.web.bean.common.*;
 import org.hsweb.web.bean.po.GenericPo;
 import org.hsweb.web.bean.valid.ValidResults;
+import org.hsweb.web.core.exception.NotFoundException;
 import org.hsweb.web.core.exception.ValidationException;
 import org.hsweb.web.core.utils.RandomUtil;
 import org.hsweb.web.dao.GenericMapper;
@@ -47,7 +48,7 @@ public abstract class AbstractServiceImpl<Po, PK> implements GenericService<Po,
         PK primaryKey = null;
         if (data instanceof GenericPo) {
             if (((GenericPo) data).getId() == null)
-                ((GenericPo) data).setId(RandomUtil.randomChar());
+                ((GenericPo) data).setId(GenericPo.createUID());
             primaryKey = (PK) ((GenericPo) data).getId();
         }
         tryValidPo(data);
@@ -97,6 +98,10 @@ public abstract class AbstractServiceImpl<Po, PK> implements GenericService<Po,
         return this.getMapper().selectByPk(pk);
     }
 
+    protected void assertNotNull(Object po, String message) {
+        if (po == null) throw new NotFoundException(message);
+    }
+
     protected void tryValidPo(Po data) {
         Set<ConstraintViolation<Object>> set = validator.validate(data);
         ValidResults results = new ValidResults();

+ 11 - 2
hsweb-web-service-impl-common/src/main/java/org/hsweb/web/service/impl/config/ConfigServiceImpl.java

@@ -1,5 +1,6 @@
 package org.hsweb.web.service.impl.config;
 
+import org.hsweb.web.bean.common.UpdateParam;
 import org.hsweb.web.bean.po.config.Config;
 import org.hsweb.web.dao.config.ConfigMapper;
 import org.hsweb.web.service.config.ConfigService;
@@ -11,6 +12,7 @@ import org.springframework.util.Assert;
 import org.webbuilder.utils.common.StringUtils;
 
 import javax.annotation.Resource;
+import java.util.Date;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Properties;
@@ -36,7 +38,13 @@ public class ConfigServiceImpl extends AbstractServiceImpl<Config, String> imple
     @Override
     @CacheEvict(value = CACHE_KEY, allEntries = true)
     public int update(Config data) throws Exception {
-        return super.update(data);
+        return configMapper.update(new UpdateParam<>(data).excludes("createDate").where("id",data.getId()));
+    }
+
+    @Override
+    @CacheEvict(value = CACHE_KEY, allEntries = true)
+    public int delete(String s) throws Exception {
+        return super.delete(s);
     }
 
     /**
@@ -47,7 +55,7 @@ public class ConfigServiceImpl extends AbstractServiceImpl<Config, String> imple
      * @throws Exception 异常信息
      */
     @Override
-    @Cacheable(value = CACHE_KEY, key = "'info.content_'+#name")
+    @Cacheable(value = CACHE_KEY, key = "'info.content.'+#name")
     public String getContent(String name) throws Exception {
         Config config = getMapper().selectByPk(name);
         if (config == null) return null;
@@ -171,6 +179,7 @@ public class ConfigServiceImpl extends AbstractServiceImpl<Config, String> imple
     public String insert(Config data) throws Exception {
         Config old = this.selectByPk(data.getId());
         Assert.isNull(old, "配置已存在,请勿重复添加!");
+        data.setCreateDate(new Date());
         return super.insert(data);
     }
 }

+ 17 - 15
hsweb-web-service-impl-common/src/main/java/org/hsweb/web/service/impl/form/DefaultFormParser.java

@@ -49,6 +49,23 @@ public class DefaultFormParser implements FormParser {
                 String key = def.getString("key");
                 Object value = def.get("value");
                 if ("main".equals(id)) {
+                    if ("trigger".equals(key)) {
+                        List<JSONObject> jsonArray = JSON.parseArray((String) value, JSONObject.class);
+                        jsonArray.forEach(jsonObject -> {
+                            String name = jsonObject.getString("key");
+                            String script = jsonObject.getString("value");
+                            ScriptTrigger scriptTrigger = new ScriptTrigger();
+                            scriptTrigger.setId(String.valueOf(script.hashCode()));
+                            if (expressionScopeBeanMap != null)
+                                scriptTrigger.setDefaultVar(expressionScopeBeanMap);
+                            scriptTrigger.setName(name);
+                            scriptTrigger.setContent(script);
+                            scriptTrigger.setLanguage("groovy");
+                            scriptTrigger.init();
+                            metaData.on(scriptTrigger);
+                        });
+                        return;
+                    }
                     metaData.attr(key, value);
                     return;
                 }
@@ -65,21 +82,6 @@ public class DefaultFormParser implements FormParser {
                     fieldMeta.setValidator(validatorList);
                     return;
                 }
-                if ("trigger".equals(key)) {
-                    List<JSONObject> jsonArray = JSON.parseArray((String) value, JSONObject.class);
-                    jsonArray.forEach(jsonObject -> {
-                        String name = jsonObject.getString("key");
-                        String script = jsonObject.getString("value");
-                        ScriptTrigger scriptTrigger = new ScriptTrigger();
-                        scriptTrigger.setId(String.valueOf(script.hashCode()));
-                        if (expressionScopeBeanMap != null)
-                            scriptTrigger.setDefaultVar(expressionScopeBeanMap);
-                        scriptTrigger.setName(name);
-                        scriptTrigger.setContent(script);
-                        scriptTrigger.setLanguage("groovy");
-                    });
-                    return;
-                }
                 Field ftmp = ReflectionUtils.findField(FieldMetaData.class, key);
                 if (ftmp != null) {
                     try {

+ 6 - 0
hsweb-web-service-impl-common/src/main/java/org/hsweb/web/service/impl/form/DynamicFormServiceImpl.java

@@ -21,6 +21,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.Assert;
 import org.webbuilder.office.excel.ExcelIO;
 import org.webbuilder.office.excel.config.Header;
@@ -43,6 +44,7 @@ import java.util.*;
  * Created by zhouhao on 16-4-14.
  */
 @Service("dynamicFormService")
+@Transactional(rollbackFor = Throwable.class)
 public class DynamicFormServiceImpl implements DynamicFormService {
 
     private final Logger logger = LoggerFactory.getLogger(this.getClass());
@@ -150,6 +152,7 @@ public class DynamicFormServiceImpl implements DynamicFormService {
     @Override
     @ReadLock
     @LockName(value = "'form.lock.'+#name", isExpression = true)
+    @Transactional(readOnly = true)
     public <T> PagerResult<T> selectPager(String name, QueryParam param) throws Exception {
         PagerResult<T> result = new PagerResult<>();
         Table table = getTableByName(name);
@@ -166,6 +169,7 @@ public class DynamicFormServiceImpl implements DynamicFormService {
     @Override
     @ReadLock
     @LockName(value = "'form.lock.'+#name", isExpression = true)
+    @Transactional(readOnly = true)
     public <T> List<T> select(String name, QueryParam param) throws Exception {
         Table table = getTableByName(name);
         Query query = table.createQuery();
@@ -177,6 +181,7 @@ public class DynamicFormServiceImpl implements DynamicFormService {
     @Override
     @ReadLock
     @LockName(value = "'form.lock.'+#name", isExpression = true)
+    @Transactional(readOnly = true)
     public int total(String name, QueryParam param) throws Exception {
         Table table = getTableByName(name);
         Query query = table.createQuery();
@@ -283,6 +288,7 @@ public class DynamicFormServiceImpl implements DynamicFormService {
     @Override
     @ReadLock
     @LockName(value = "'form.lock.'+#name", isExpression = true)
+    @Transactional(readOnly = true)
     public void exportExcel(String name, QueryParam param, OutputStream outputStream) throws Exception {
         List<Object> dataList = select(name, param);
         Table table = getTableByName(name);

+ 163 - 0
hsweb-web-service-impl-common/src/main/java/org/hsweb/web/service/impl/template/TemplateServiceImpl.java

@@ -0,0 +1,163 @@
+package org.hsweb.web.service.impl.template;
+
+import com.alibaba.fastjson.JSON;
+import org.hsweb.web.bean.common.QueryParam;
+import org.hsweb.web.bean.common.UpdateParam;
+import org.hsweb.web.bean.po.history.History;
+import org.hsweb.web.bean.po.template.Template;
+import org.hsweb.web.dao.GenericMapper;
+import org.hsweb.web.dao.template.TemplateMapper;
+import org.hsweb.web.service.history.HistoryService;
+import org.hsweb.web.service.impl.AbstractServiceImpl;
+import org.hsweb.web.service.template.TemplateService;
+import org.springframework.cache.annotation.CacheEvict;
+import org.springframework.cache.annotation.Cacheable;
+import org.springframework.cache.annotation.Caching;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * Created by zhouhao on 16-5-20.
+ */
+@Service("templateService")
+public class TemplateServiceImpl extends AbstractServiceImpl<Template, String> implements TemplateService {
+
+    private static final String CACHE_NAME = "template";
+
+    @Resource
+    private TemplateMapper templateMapper;
+
+    @Resource
+    private HistoryService historyService;
+
+    @Override
+    protected TemplateMapper getMapper() {
+        return templateMapper;
+    }
+
+    @Override
+    public String insert(Template data) throws Exception {
+        data.setVersion(1);
+        data.setUsing(false);
+        data.setRelease(0);
+        data.setRevision(0);
+        return super.insert(data);
+    }
+
+    @Override
+    public String createNewVersion(String oldVersionId) throws Exception {
+        Template old = templateMapper.selectByPk(oldVersionId);
+        assertNotNull(old, "模板不存在");
+        old.setId(null);
+        old.setVersion(old.getVersion() + 1);
+        old.setRevision(0);
+        old.setRelease(0);
+        old.setUsing(false);
+        insert(old);
+        return old.getId();
+    }
+
+    @Override
+    @Transactional(readOnly = true)
+    public List<Template> selectLatestList(QueryParam param) throws Exception {
+        return templateMapper.selectLatestList(param);
+    }
+
+    @Override
+    @Transactional(readOnly = true)
+    public int countLatestList(QueryParam param) throws Exception {
+        return templateMapper.countLatestList(param);
+    }
+
+    @Override
+    @CacheEvict(value = CACHE_NAME,
+            key = "'template.name.using'+target.selectByPk(#id).getName()",
+            condition = "target.selectByPk(#id).isUsing()")
+    public int update(Template data) throws Exception {
+        Template old = selectByPk(data.getId());
+        assertNotNull(old, "模板不存在");
+        data.setRevision(old.getRevision() + 1);
+        UpdateParam<Template> param = new UpdateParam<>(data)
+                .excludes("version", "revision", "release", "using")
+                .where("id", data.getId());
+        return templateMapper.update(param);
+    }
+
+    @Override
+    @Caching(
+            evict = {
+                    @CacheEvict(value = CACHE_NAME, key = "'template.using.name.'+target.selectByPk(#id).getName()"),
+                    @CacheEvict(value = CACHE_NAME, key = "'template.deploy.name.'+target.selectByPk(#id).getName()")
+            }
+    )
+    public void deploy(String id) throws Exception {
+        Template old = templateMapper.selectByPk(id);
+        assertNotNull(old, "模板不存在");
+        Template usingTemplate = selectUsing(old.getName());
+        if (usingTemplate != null) {
+            usingTemplate.setUsing(true);
+            templateMapper.update(new UpdateParam<>(usingTemplate).includes("using").where("id", usingTemplate.getId()));
+        }
+        old.setUsing(true);
+        templateMapper.update(new UpdateParam<>(old).includes("using").where("id", old.getId()));
+        History history = new History();
+        history.setPrimaryKeyName("id");
+        history.setPrimaryKeyValue(id);
+        history.setChangeAfter(JSON.toJSONString(old));
+        history.setDescribe("模板发布历史");
+        history.setType("template.deploy." + old.getName());
+        history.setCreateDate(new Date());
+        historyService.insert(history);
+    }
+
+    @Override
+    @Caching(
+            evict = {
+                    @CacheEvict(value = CACHE_NAME, key = "'template.using.name.'+target.selectByPk(#id).getName()")
+                    , @CacheEvict(value = CACHE_NAME, key = "'template.deploy.name'+target.selectByPk(#id).getName()")
+            }
+    )
+    public void unDeploy(String id) throws Exception {
+        Template old = templateMapper.selectByPk(id);
+        assertNotNull(old, "模板不存在");
+        old.setUsing(false);
+        templateMapper.update(new UpdateParam<>(old).includes("using").where("id", old.getId()));
+    }
+
+    @Override
+    @Transactional(readOnly = true)
+    public Template selectLatest(String name) throws Exception {
+        QueryParam param = QueryParam.newInstance()
+                .where("name", name).orderBy("version").desc().doPaging(0, 1);
+        List<Template> templates = selectLatestList(param);
+        return templates.size() > 0 ? templates.get(0) : null;
+    }
+
+    @Override
+    @Cacheable(value = CACHE_NAME, key = "'template.name.'+#name+':'+#version")
+    public Template selectByVersion(String name, int version) throws Exception {
+        QueryParam param = QueryParam.newInstance().where("name", name).and("version", version);
+        return this.selectSingle(param);
+    }
+
+    @Override
+    @Cacheable(value = CACHE_NAME, key = "'template.deploy.name.'+#name")
+    public Template selectDeploy(String name) throws Exception {
+        Template deployed = selectUsing(name);
+        assertNotNull(deployed, "模板不存在或未部署");
+        History history = historyService.selectLastHistoryByType("template.deploy." + name);
+        assertNotNull(history, "模板不存在或未部署");
+        return JSON.parseObject(history.getChangeAfter(), Template.class);
+    }
+
+    @Override
+    @Cacheable(value = CACHE_NAME, key = "'template.using.name.'+#name")
+    public Template selectUsing(String name) throws Exception {
+        QueryParam param = QueryParam.newInstance().where("name", name).and("using", true);
+        return this.selectSingle(param);
+    }
+}

+ 3 - 3
hsweb-web-service-impl-common/src/main/java/org/hsweb/web/service/impl/user/UserServiceImpl.java

@@ -81,7 +81,7 @@ public class UserServiceImpl extends AbstractServiceImpl<User, String> implement
             data.setPassword(MD5.encode(data.getPassword()));
             userMapper.updatePassword(data);
         }
-        int i = userMapper.update(new UpdateParam<>(data).excludes("status","password","createDate"));
+        int i = userMapper.update(new UpdateParam<>(data).excludes("status", "password", "createDate"));
         if (data.getUserRoles().size() != 0) {
             //删除所有
             userRoleMapper.deleteByUserId(data.getId());
@@ -96,7 +96,7 @@ public class UserServiceImpl extends AbstractServiceImpl<User, String> implement
 
     @Override
     public void initAdminUser(User user) throws Exception {
-        QueryParam queryParam = new QueryParam();
+        QueryParam queryParam = new QueryParam().noPaging();
         queryParam.orderBy("sortIndex");
         List<Module> modules = moduleService.select(queryParam);
         Map<Module, Set<String>> roleInfo = new LinkedHashMap<>();
@@ -108,7 +108,7 @@ public class UserServiceImpl extends AbstractServiceImpl<User, String> implement
 
     @Override
     public void initGuestUser(User user) throws Exception {
-        List<UserRole> userRoles = userRoleMapper.select(new QueryParam().where("roleId", "guest"));
+        List<UserRole> userRoles = userRoleMapper.select(new QueryParam().where("roleId", "guest").noPaging());
         user.setUserRoles(userRoles);
         user.initRoleInfo();
     }

+ 3 - 10
hsweb-web-service-impl-common/src/test/java/org/hsweb/web/service/impl/system/DataBaseManagerServiceImplTest.java

@@ -46,16 +46,9 @@ public class DataBaseManagerServiceImplTest extends AbstractTestCase {
     @Test
     public void test() throws Exception {
         QueryParam queryParam = new QueryParam();
-        Term term = queryParam.select("username", "password")
-                .where("createDate$GT", "2015-12-10")
-                .nest();
-        term = term.nest("username", "admin").or("username", "test").nest();
-        term = term.nest();
-        term.orNest("status$IN", "1,2,3").and("status$LT", "0");
-        term.nest("status$IN", "2,3,4").and("status$LT", "1");
-        term.and("username$EMPTY", true);
-        queryParam.orderBy("create_date").desc();
-        queryParam.orderBy("status").asc();
+          queryParam.select("username", "password")
+                .where("createDate$GT", "2015-12-10");
+
         userMapper.select(queryParam);
         User user = userMapper.selectByPk("admin");
         user.setId("aaaa");

+ 81 - 0
hsweb-web-service-impl-common/src/test/java/org/hsweb/web/service/impl/template/TemplateServiceImplTest.java

@@ -0,0 +1,81 @@
+package org.hsweb.web.service.impl.template;
+
+import org.hsweb.web.bean.common.QueryParam;
+import org.hsweb.web.bean.po.template.Template;
+import org.hsweb.web.service.impl.AbstractTestCase;
+import org.hsweb.web.service.template.TemplateService;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.springframework.test.annotation.Rollback;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+
+import java.util.Arrays;
+import java.util.List;
+
+import static org.junit.Assert.*;
+
+/**
+ * Created by zhouhao on 16-5-23.
+ */
+@Rollback
+@Transactional
+public class TemplateServiceImplTest extends AbstractTestCase {
+
+    @Resource
+    private TemplateService templateService;
+
+    private String templateId;
+
+    @Before
+    public void setUp() throws Exception {
+        Template template = new Template();
+        template.setName("test");
+        template.setCssLinks(Arrays.asList("http://***/template.css", "/test.css"));
+        template.setScriptLinks(Arrays.asList("http://***/template.js", "/test.js"));
+        template.setTemplate("你好:{{user.name}}");
+        template.setType("default");
+        templateService.insert(template);
+        templateId = template.getId();
+        testDeploy();
+    }
+
+    @Test
+    public void testCreateNewVersion() throws Exception {
+        String id = templateService.createNewVersion(templateId);
+        Template newVersion = templateService.selectByPk(id);
+        Assert.assertEquals(newVersion.getVersion(), 1);
+        Assert.assertEquals(newVersion.getCssLinks().size(), 2);
+        Assert.assertEquals(newVersion.getScriptLinks().size(), 2);
+        Assert.assertEquals(newVersion.getTemplate(), "你好:{{user.name}}");
+    }
+
+    @Test
+    public void testSelectLatestList() throws Exception {
+        List<Template> list = templateService.selectLatestList(new QueryParam());
+        Assert.assertEquals(list.size(), 1);
+        Assert.assertEquals(list.get(0).getVersion(), 1);
+    }
+
+    public void testDeploy() throws Exception {
+        templateService.deploy(templateId);
+        Template template = templateService.selectDeploy("test");
+        Assert.assertEquals(template.getId(), templateId);
+    }
+
+    @After
+    public void testUnDeploy() throws Exception {
+        templateService.unDeploy(templateId);
+        Template template = templateService.selectDeploy("test");
+        Assert.assertNotNull(template);
+    }
+
+    @Test
+    public void testSelectByVersion() throws Exception {
+        Template template = templateService.selectByVersion("name", 2);
+        Assert.assertNull(template);
+    }
+}

+ 1 - 1
hsweb-web-service-impl-common/src/test/resources/application.yml

@@ -30,4 +30,4 @@ mybatis:
     type-aliases-package: org.hsweb.web.bean.po
     mapper-locations: classpath*:org/hsweb/web/dao/impl/mybatis/mapper/oracle/**/*.xml
     config: classpath:mybatis-config.xml
-    typeHandlersPackage: org.hsweb.web.mybatis.handler
+    typeHandlers-package: org.hsweb.web.mybatis.handler

+ 3 - 0
hsweb-web-service-impl-common/src/test/resources/mybatis-config.xml

@@ -50,4 +50,7 @@
         <setting name="aggressiveLazyLoading" value="false"/>
         <setting name="proxyFactory" value="CGLIB"/>
     </settings>
+    <typeHandlers>
+        <package name="org.hsweb.web.mybatis.handler"></package>
+    </typeHandlers>
 </configuration>

+ 31 - 0
hsweb-web-service-interface/src/main/java/org/hsweb/web/service/template/TemplateService.java

@@ -0,0 +1,31 @@
+package org.hsweb.web.service.template;
+
+import org.hsweb.web.bean.common.QueryParam;
+import org.hsweb.web.bean.po.form.Form;
+import org.hsweb.web.bean.po.template.Template;
+import org.hsweb.web.service.GenericService;
+import org.hsweb.web.service.form.DynamicFormService;
+
+import java.util.List;
+
+public interface TemplateService extends GenericService<Template, String> {
+
+    String createNewVersion(String oldVersionId) throws Exception;
+
+    List<Template> selectLatestList(QueryParam param) throws Exception;
+
+    int countLatestList(QueryParam param) throws Exception;
+
+    void deploy(String id) throws Exception;
+
+    void unDeploy(String id) throws Exception;
+
+    Template selectLatest(String name) throws Exception;
+
+    Template selectByVersion(String name, int version) throws Exception;
+
+    Template selectUsing(String name) throws Exception;
+
+    Template selectDeploy(String name) throws Exception;
+
+}

+ 0 - 1
hsweb-web-websocket/pom.xml

@@ -23,7 +23,6 @@
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-websocket</artifactId>
-            <version>${spring.boot.version}</version>
         </dependency>
 
     </dependencies>

+ 1 - 0
hsweb-web-websocket/src/main/java/org/hsweb/web/socket/CmdWebSocketHandler.java

@@ -31,6 +31,7 @@ public class CmdWebSocketHandler extends TextWebSocketHandler {
         if (logger.isInfoEnabled())
             logger.info("handleMessage,id:{} msg={}", session.getId(), message.getPayload());
         try {
+
             CMD request = JSON.parseObject(message.getPayload(), CMD.class);
             CmdProcessor processor = processorContainer.getCmdProcessor(request.getCmd());
             if (null != processor) {

+ 1 - 1
hsweb-web-websocket/src/test/java/org/hsweb/web/socket/WebSocketClientTest.java

@@ -19,7 +19,7 @@ public class WebSocketClientTest {
 
     public static void main(String[] args) throws Exception {
         WebSocketClient client = new StandardWebSocketClient();
-        String url = "ws://localhost:8080/socket";
+        String url = "ws://localhost:8088/socket";
         client.doHandshake(new AbstractWebSocketHandler() {
             @Override
             public void afterConnectionEstablished(WebSocketSession session) throws Exception {

+ 18 - 0
pom.xml

@@ -139,6 +139,24 @@
                 <groupId>org.webbuilder</groupId>
                 <artifactId>wb-office</artifactId>
                 <version>${webbuilder.version}</version>
+                <exclusions>
+                    <exclusion>
+                        <groupId>org.slf4j</groupId>
+                        <artifactId>slf4j-api</artifactId>
+                    </exclusion>
+                    <exclusion>
+                        <groupId>log4j</groupId>
+                        <artifactId>log4j</artifactId>
+                    </exclusion>
+                    <exclusion>
+                        <groupId>org.slf4j</groupId>
+                        <artifactId>slf4j-log4j12</artifactId>
+                    </exclusion>
+                    <exclusion>
+                        <groupId>ch.qos.logback</groupId>
+                        <artifactId>logback-classic</artifactId>
+                    </exclusion>
+                </exclusions>
             </dependency>
             <!--<dependency>-->
             <!--<groupId>com.vaadin</groupId>-->