Bläddra i källkod

新增功能,修复若干bug

周浩 9 år sedan
förälder
incheckning
157a39c467

+ 4 - 0
hsweb-web-service-impl-common/pom.xml

@@ -36,6 +36,10 @@
             <scope>test</scope>
         </dependency>
 
+        <dependency>
+            <groupId>org.codehaus.groovy</groupId>
+            <artifactId>groovy-all</artifactId>
+        </dependency>
         <dependency>
             <groupId>org.hsweb</groupId>
             <artifactId>hsweb-web-concurrent-cache</artifactId>

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

@@ -3,6 +3,8 @@ 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.ValidationException;
+import org.hsweb.web.core.utils.RandomUtil;
 import org.hsweb.web.dao.GenericMapper;
 import org.hsweb.web.service.GenericService;
 import org.slf4j.Logger;
@@ -11,7 +13,6 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.validation.ConstraintViolation;
-import javax.validation.ValidationException;
 import javax.validation.Validator;
 import java.util.List;
 import java.util.Set;
@@ -43,12 +44,15 @@ public abstract class AbstractServiceImpl<Po, PK> implements GenericService<Po,
 
     @Override
     public PK insert(Po data) throws Exception {
-        tryValidPo(data);
-        getMapper().insert(new InsertParam<>(data));
+        PK primaryKey = null;
         if (data instanceof GenericPo) {
-            return (PK) ((GenericPo) data).getU_id();
+            if (((GenericPo) data).getU_id() == null)
+                ((GenericPo) data).setU_id(RandomUtil.randomChar());
+            primaryKey = (PK) ((GenericPo) data).getU_id();
         }
-        return null;
+        tryValidPo(data);
+        getMapper().insert(new InsertParam<>(data));
+        return primaryKey;
     }
 
     @Override
@@ -102,6 +106,6 @@ public abstract class AbstractServiceImpl<Po, PK> implements GenericService<Po,
             }
         }
         if (!results.isSuccess())
-            throw new ValidationException(results.toString());
+            throw new ValidationException(results);
     }
 }

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

@@ -3,6 +3,7 @@ package org.hsweb.web.service.impl.form;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+import org.hibernate.validator.constraints.Length;
 import org.hsweb.web.bean.po.form.Form;
 import org.jsoup.Jsoup;
 import org.jsoup.nodes.Element;
@@ -21,7 +22,6 @@ import java.util.*;
  * Created by zhouhao on 16-4-20.
  */
 public class DefaultFormParser implements FormParser {
-
     @Override
     public TableMetaData parse(Form form) {
         String meta = form.getMeta();

+ 23 - 17
hsweb-web-service-impl-common/src/main/java/org/hsweb/web/service/impl/form/validator/GroovyDycBeanValidator.java

@@ -2,18 +2,16 @@ package org.hsweb.web.service.impl.form.validator;
 
 import org.hsweb.web.bean.valid.ValidResults;
 import org.hsweb.web.core.exception.BusinessException;
+import org.hsweb.web.core.exception.ValidationException;
+import org.springframework.util.ReflectionUtils;
 import org.webbuilder.sql.validator.Validator;
 import org.webbuilder.utils.common.BeanUtils;
-import org.webbuilder.utils.common.ClassUtils;
 import org.webbuilder.utils.script.engine.DynamicScriptEngine;
 import org.webbuilder.utils.script.engine.DynamicScriptEngineFactory;
 
 import javax.validation.ConstraintViolation;
-import javax.xml.bind.ValidationException;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.lang.reflect.Field;
+import java.util.*;
 
 /**
  * 基于Groovy动态Bean对象验证
@@ -39,26 +37,34 @@ public class GroovyDycBeanValidator implements Validator {
             if (!(data instanceof Map)) {
                 throw new ValidationException("数据类型错误!");
             }
-            Object bean = engine.execute(className + ".getInstance", new HashMap<>()).getResult();
+            Object validatorTarget = engine.execute(className + ".instance", new HashMap<>()).getResult();
+            Class validatorTargetClass = validatorTarget.getClass();
             Map<String, Object> mapData = ((Map) data);
-            for (Map.Entry<String, Object> entry : mapData.entrySet()) {
-                BeanUtils.attr(bean, entry.getKey(), entry.getValue());
-            }
-            Set<ConstraintViolation<Object>> result = hibernateValidator.validate(bean);
+            Set<ConstraintViolation<Object>> result = new LinkedHashSet<>();
+            if (insert) {
+                mapData.forEach((key, value) -> {
+                    try {
+                        BeanUtils.attr(validatorTarget, key, value);
+                    } catch (Exception e) {
+                    }
+                });
+                result.addAll(hibernateValidator.validate(validatorTarget));
+            } else
+                mapData.forEach((key, value) -> {
+                    Field field = ReflectionUtils.findField(validatorTargetClass, key);
+                    if (field != null)
+                        result.addAll(hibernateValidator.validateValue(validatorTargetClass, key, value));
+                });
             if (result.size() > 0) {
                 for (ConstraintViolation<Object> violation : result) {
                     String property = violation.getPropertyPath().toString();
-                    if (insert) {
-                        results.addResult(property, violation.getMessage());
-                    } else if (mapData.containsKey(property)) {
-                        results.addResult(property, violation.getMessage());
-                    }
+                    results.addResult(property, violation.getMessage());
                 }
             }
         } catch (Exception e) {
             throw new BusinessException("验证器异常!", e, 500);
         }
-        if (results.size() > 0) throw new BusinessException(results.toString(), 400);
+        if (results.size() > 0) throw new ValidationException(results);
         return null;
         //采用异常通知方式
     }

+ 3 - 1
hsweb-web-service-impl-common/src/main/java/org/hsweb/web/service/impl/form/validator/GroovyDycBeanValidatorFactory.java

@@ -56,6 +56,7 @@ public class GroovyDycBeanValidatorFactory implements ValidatorFactory {
         script.append("public class ").append(metaData.getName()).append("{\n");
         boolean hasValidator = false;
         for (FieldMetaData fieldMetaData : metaData.getFields()) {
+            if(fieldMetaData.getValidator().isEmpty())continue;
             for (String ann : fieldMetaData.getValidator()) {
                 hasValidator = true;
                 script.append("\t@").append(ann).append("\n");
@@ -67,6 +68,7 @@ public class GroovyDycBeanValidatorFactory implements ValidatorFactory {
         //没有配置验证器
         if (!hasValidator) return null;
         for (FieldMetaData fieldMetaData : metaData.getFields()) {
+            if(fieldMetaData.getValidator().isEmpty())continue;
             script.append("public ")
                     .append(fieldMetaData.getJavaType().getName()).append(" get")
                     .append(StringUtils.toUpperCaseFirstOne(fieldMetaData.getName()))
@@ -84,7 +86,7 @@ public class GroovyDycBeanValidatorFactory implements ValidatorFactory {
         script.append("}");
         try {
             engine.compile(className, script.toString());
-            engine.compile(className + ".getInstance", "return new " + className + "();");
+            engine.compile(className + ".instance", "return new "+ className + "();");
         } catch (Exception e) {
             throw new BusinessException("创建动态表单验证器失败!", e, 500);
         }

+ 34 - 0
hsweb-web-service-impl-common/src/main/java/org/hsweb/web/service/impl/module/ModuleMetaServiceImpl.java

@@ -0,0 +1,34 @@
+package org.hsweb.web.service.impl.module;
+
+import org.hsweb.web.bean.po.module.ModuleMeta;
+import org.hsweb.web.core.utils.RandomUtil;
+import org.hsweb.web.dao.module.ModuleMetaMapper;
+import org.hsweb.web.service.impl.AbstractServiceImpl;
+import org.hsweb.web.service.module.ModuleMetaService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cache.annotation.CacheEvict;
+import org.springframework.stereotype.Service;
+
+/**
+ * Created by zhouhao on 16-5-10.
+ */
+@Service("moduleMetaService")
+public class ModuleMetaServiceImpl extends AbstractServiceImpl<ModuleMeta, String> implements ModuleMetaService {
+
+    public static final String CACHE_NAME ="module.meta";
+
+    @Autowired
+    private ModuleMetaMapper moduleMetaMapper;
+
+    @Override
+    protected ModuleMetaMapper getMapper() {
+        return moduleMetaMapper;
+    }
+
+    @Override
+    @CacheEvict(value = CACHE_NAME, allEntries = true)
+    public int update(ModuleMeta data) throws Exception {
+        return super.update(data);
+    }
+
+}

+ 6 - 14
hsweb-web-service-impl-common/src/main/java/org/hsweb/web/service/impl/script/DynamicScriptServiceImpl.java

@@ -33,17 +33,15 @@ public class DynamicScriptServiceImpl extends AbstractServiceImpl<DynamicScript,
     }
 
     @Override
-    @Cacheable(value = CACHE_KEY, key = "#pk")
+    @Cacheable(value = CACHE_KEY, key = "'script.'+#pk")
     public DynamicScript selectByPk(String pk) throws Exception {
         return super.selectByPk(pk);
     }
 
     @Override
-    @CacheEvict(value = CACHE_KEY, key = "#data.u_id")
+    @CacheEvict(value = CACHE_KEY, key = "'script.'+#data.u_id")
     public int update(DynamicScript data) throws Exception {
         int i = super.update(data);
-        DynamicScriptEngine engine = DynamicScriptEngineFactory.getEngine(data.getType());
-        engine.compile(data.getU_id(), data.getContent());
         return i;
     }
 
@@ -51,15 +49,11 @@ public class DynamicScriptServiceImpl extends AbstractServiceImpl<DynamicScript,
     @CacheEvict(value = CACHE_KEY, allEntries = true)
     public int update(List<DynamicScript> datas) throws Exception {
         int i = super.update(datas);
-        for (DynamicScript data : datas) {
-            DynamicScriptEngine engine = DynamicScriptEngineFactory.getEngine(data.getType());
-            engine.compile(data.getU_id(), data.getContent());
-        }
         return i;
     }
 
     @Override
-    @CacheEvict(value = CACHE_KEY, key = "#pk")
+    @CacheEvict(value = CACHE_KEY, key = "'script.'+#pk")
     public int delete(String pk) throws Exception {
         return super.delete(pk);
     }
@@ -69,6 +63,7 @@ public class DynamicScriptServiceImpl extends AbstractServiceImpl<DynamicScript,
         if (script == null) throw new BusinessException(String.format("脚本[%s]不存在", id));
         DynamicScriptEngine engine = DynamicScriptEngineFactory.getEngine(script.getType());
         try {
+            if(engine==null)throw new BusinessException("不支持的脚本语言:"+script.getType());
             engine.compile(script.getU_id(), script.getContent());
         } catch (Exception e) {
             logger.error("compile error!", e);
@@ -79,11 +74,8 @@ public class DynamicScriptServiceImpl extends AbstractServiceImpl<DynamicScript,
         List<DynamicScript> list = this.select();
         for (DynamicScript script : list) {
             DynamicScriptEngine engine = DynamicScriptEngineFactory.getEngine(script.getType());
-            try {
-                engine.compile(script.getU_id(), script.getContent());
-            } catch (Exception e) {
-                logger.error("compile error!", e);
-            }
+            if(engine==null)throw new BusinessException("不支持的脚本语言:"+script.getType());
+            engine.compile(script.getU_id(), script.getContent());
         }
     }
 

+ 12 - 7
hsweb-web-service-impl-common/src/test/java/org/hsweb/web/service/impl/form/FormServiceImplTest.java

@@ -2,6 +2,7 @@ package org.hsweb.web.service.impl.form;
 
 import org.hsweb.web.core.authorize.ExpressionScopeBean;
 import org.hsweb.web.bean.po.form.Form;
+import org.hsweb.web.core.exception.BusinessException;
 import org.hsweb.web.service.form.FormService;
 import org.hsweb.web.service.impl.AbstractTestCase;
 import org.hsweb.web.core.utils.RandomUtil;
@@ -14,6 +15,7 @@ import org.springframework.transaction.annotation.Transactional;
 import org.webbuilder.sql.DataBase;
 import org.webbuilder.sql.param.insert.InsertParam;
 import org.webbuilder.sql.param.query.QueryParam;
+import org.webbuilder.sql.param.update.UpdateParam;
 import org.webbuilder.sql.support.executor.SqlExecutor;
 
 import javax.annotation.Resource;
@@ -53,6 +55,7 @@ public class FormServiceImplTest extends AbstractTestCase {
                     "{\"key\":\"name\",\"value\":\"name\",\"describe\":\"名称\"}," +
                     "{\"key\":\"comment\",\"value\":\"test\",\"describe\":\"字段描述\"}," +
                     "{\"key\":\"javaType\",\"value\":\"string\",\"describe\":\"java类型\"}," +
+                    "{\"key\":\"validator-list\",\"value\":\"[{\\\"validator\\\":\\\"NotNull\\\"}]\",,\"describe\":\"java类型\"}," +
                     "{\"key\":\"dataType\",\"value\":\"varchar2(32)\",\"describe\":\"数据库类型\"}" +
                     "]" +
                     "}",
@@ -93,20 +96,22 @@ public class FormServiceImplTest extends AbstractTestCase {
     public void testDeploy() throws Exception {
         //部署
         formService.deploy(form.getU_id());
-        dataBase.getTable("test_form").createInsert()
-                .insert(new InsertParam().value("name", "张三").value("u_id", "test"));
+            dataBase.getTable("test_form").createInsert()
+                    .insert(new InsertParam().value("u_id", "test").value("name","张三"));
+        dataBase.getTable("test_form").createUpdate().update(new UpdateParam().set("u_id","test2").where("u_id","test"));
+
         Map<String, Object> data = dataBase.getTable("test_form")
                 .createQuery().single(new QueryParam().where("name$LIKE", "张三"));
-        Assert.assertEquals("张三", data.get("name"));
 
-        System.out.println(formService.createDeployHtml(form.getName()));
+        Assert.assertEquals("张三", data.get("name"));
+        Assert.assertEquals("test2", data.get("u_id"));
         formService.createDeployHtml(form.getName());
         formService.deploy(form.getU_id());
         formService.createDeployHtml(form.getName());
 
-//        form.setMeta(meta[1]);
-//        formService.update(form);
-//        formService.deploy(form.getU_id());
+        form.setMeta(meta[1]);
+        formService.update(form);
+        formService.deploy(form.getU_id());
     }
 
 

+ 16 - 7
hsweb-web-service-impl-common/src/test/java/org/hsweb/web/service/impl/system/DataBaseManagerServiceImplTest.java

@@ -1,9 +1,11 @@
 package org.hsweb.web.service.impl.system;
 
 import org.hsweb.web.bean.common.QueryParam;
+import org.hsweb.web.bean.common.Term;
 import org.hsweb.web.bean.po.module.Module;
 import org.hsweb.web.dao.user.UserMapper;
 import org.hsweb.web.service.impl.AbstractTestCase;
+import org.hsweb.web.service.module.ModuleMetaService;
 import org.hsweb.web.service.module.ModuleService;
 import org.hsweb.web.service.system.DataBaseManagerService;
 import org.junit.Test;
@@ -26,24 +28,31 @@ public class DataBaseManagerServiceImplTest extends AbstractTestCase {
     @Resource
     private SqlExecutor sqlExecutor;
 
+    @Resource
+    private ModuleMetaService moduleMetaService;
+
     @Resource
     private UserMapper userMapper;
 
     @Test
-    public void testGetTableNameList() throws Exception {
+    public void test() throws Exception {
         QueryParam queryParam = new QueryParam();
-//        queryParam.nest("name$LIKE", "%admin")
-//                .or("name","1")
-//                .nestOr("name","1")
-//                .and("name","2");
-        queryParam.select("username", "password")
+        Term term = queryParam.select("username", "password")
                 .where("create_date$GT", "2015-12-10")
-                .nest("username","admin").or("username", "test");
+                .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();
+        System.out.println(queryParam);
         userMapper.select(queryParam);
     }
 
     @Test
     public void testGetFieldList() throws Exception {
+        moduleMetaService.selectByKeyAndRoleId("test","userRole");
 
     }