ソースを参照

新增html预览,完善部署逻辑

周浩 9 年 前
コミット
d105f5bb17

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

@@ -24,11 +24,18 @@
             <artifactId>ojdbc14</artifactId>
             <scope>test</scope>
         </dependency>
+
         <dependency>
             <groupId>com.h2database</groupId>
             <artifactId>h2</artifactId>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>javax.el</groupId>
+            <artifactId>el-api</artifactId>
+            <version>2.2</version>
+            <scope>provided</scope>
+        </dependency>
         <dependency>
             <groupId>org.webbuilder</groupId>
             <artifactId>wb-sql-util</artifactId>

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

@@ -36,6 +36,7 @@ public abstract class AbstractServiceImpl<Po, PK> implements GenericService<Po,
 
     @Override
     public PK insert(Po data) throws Exception {
+        tryValidPo(data);
         getMapper().insert(new InsertParam<>(data));
         if (data instanceof GenericPo) {
             return (PK) ((GenericPo) data).getU_id();

+ 54 - 0
hsweb-web-service-impl-common/src/main/java/org/hsweb/web/service/impl/DataBaseAutoConfiguration.java

@@ -0,0 +1,54 @@
+package org.hsweb.web.service.impl;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.webbuilder.sql.DataBase;
+import org.webbuilder.sql.DataBaseMetaData;
+import org.webbuilder.sql.support.MysqlDataBaseMetaData;
+import org.webbuilder.sql.support.OracleDataBaseMetaData;
+import org.webbuilder.sql.support.common.CommonDataBase;
+import org.webbuilder.sql.support.executor.SqlExecutor;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.Resource;
+import java.util.Map;
+
+/**
+ * Created by zhouhao on 16-4-20.
+ */
+@Configuration
+@ConfigurationProperties(
+        prefix = "spring.datasource"
+)
+public class DataBaseAutoConfiguration {
+    @Resource
+    private SqlExecutor sqlExecutor;
+    @Autowired
+    private DataSourceProperties properties;
+
+    @PostConstruct
+    public void init() {
+
+    }
+
+    @Bean
+    public DataBase getDataBase() {
+        DataBaseMetaData dataBaseMetaData = null;
+        String driverClassName = properties.getDriverClassName();
+        if (driverClassName.contains("mysql")) {
+            dataBaseMetaData = new MysqlDataBaseMetaData();
+        } else if (driverClassName.contains("oracle")) {
+            dataBaseMetaData = new OracleDataBaseMetaData();
+        } else if (driverClassName.contains("h2")) {
+            dataBaseMetaData = new OracleDataBaseMetaData();
+        }
+
+        if (dataBaseMetaData == null)
+            dataBaseMetaData = new OracleDataBaseMetaData();
+        DataBase dataBase = new CommonDataBase(dataBaseMetaData, sqlExecutor);
+        return dataBase;
+    }
+}

+ 36 - 15
hsweb-web-service-impl-common/src/main/java/org/hsweb/web/service/impl/form/CommonFormParser.java

@@ -4,20 +4,28 @@ import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import org.hsweb.web.bean.po.form.Form;
+import org.jsoup.Jsoup;
+import org.jsoup.nodes.Document;
+import org.jsoup.nodes.Element;
+import org.jsoup.select.Elements;
+import org.springframework.util.Assert;
 import org.springframework.util.ReflectionUtils;
 import org.webbuilder.sql.FieldMetaData;
 import org.webbuilder.sql.TableMetaData;
 import org.webbuilder.utils.common.BeanUtils;
+import org.webbuilder.utils.common.StringUtils;
 
 import java.lang.reflect.Field;
 import java.util.Date;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 /**
  * Created by zhouhao on 16-4-20.
  */
 public class CommonFormParser implements FormParser {
+
     @Override
     public TableMetaData parse(Form form) {
         String meta = form.getMeta();
@@ -29,6 +37,7 @@ public class CommonFormParser implements FormParser {
         object.forEach((id, field) -> {
             if ("main".equals(id)) return;
             FieldMetaData fieldMeta = new FieldMetaData();
+            fieldMeta.attr("field-id", id);
             JSONArray obj = ((JSONArray) field);
             obj.forEach((defT) -> {
                 JSONObject def = ((JSONObject) defT);
@@ -52,28 +61,18 @@ public class CommonFormParser implements FormParser {
                         }
                     }
                     fieldMeta.attr(key, value);
-                    metaData.addField(fieldMeta);
                 }
                 validField(fieldMeta);
             });
+            metaData.addField(fieldMeta);
         });
         return metaData;
     }
 
-    protected JSONObject castObj2JsonObject(Object object) {
-        JSONObject obj = null;
-        if (object instanceof JSONObject) {
-            obj = ((JSONObject) object);
-        } else if (object instanceof Map) {
-            obj = new JSONObject(((Map) object));
-        } else if (object instanceof String) {
-            obj = JSON.parseObject(object.toString());
-        }
-        return obj;
-    }
 
     public void validField(FieldMetaData field) {
-
+        Assert.notNull(field.getName(), "字段名称不能为空!");
+        Assert.notNull(field.getJavaType(), "java类型未找到!");
     }
 
     protected static Map<String, Class> typeMapper = new HashMap() {{
@@ -103,7 +102,29 @@ public class CommonFormParser implements FormParser {
         return clazz;
     }
 
-    public static void main(String[] args) {
-
+    @Override
+    public String parseHtml(Form form) {
+        TableMetaData metaData = parse(form);
+        Element html = Jsoup.parse(form.getHtml());
+        metaData.getFields().forEach((field) -> {
+            String field_id = field.attrWrapper("field-id", "").toString();
+            if (!"".equals(field_id)) {
+                Elements elements = html.select("[field-id=\"" + field_id + "\"]");
+                Element input = elements.first();
+                if (null != input) {
+                    List<Map> domProperty = field.attrWrapper("domProperty", "[]").toList();
+                    domProperty.forEach((property) -> {
+                        Object value = property.get("value");
+                        Object key = property.get("key");
+                        if (StringUtils.isNullOrEmpty(value) || StringUtils.isNullOrEmpty(key)) return;
+                        input.attr(String.valueOf(property.get("key")), String.valueOf(value));
+                    });
+                    input.attr("name", field.getName());
+                    input.attr("id", field.getName());
+                    input.attr("class", field.attrWrapper("class").toString());
+                }
+            }
+        });
+        return html.toString();
     }
 }

+ 146 - 22
hsweb-web-service-impl-common/src/main/java/org/hsweb/web/service/impl/form/DynamicFormServiceImpl.java

@@ -1,14 +1,16 @@
 package org.hsweb.web.service.impl.form;
 
-import org.hsweb.web.bean.common.PagerResult;
-import org.hsweb.web.bean.common.QueryParam;
+import com.alibaba.fastjson.JSON;
+import org.hsweb.web.bean.common.*;
 import org.hsweb.web.bean.po.form.Form;
+import org.hsweb.web.bean.po.history.History;
 import org.hsweb.web.service.form.DynamicFormService;
 import org.hsweb.web.service.form.FormService;
+import org.hsweb.web.service.history.HistoryService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-import org.webbuilder.sql.DataBase;
-import org.webbuilder.sql.TableMetaData;
+import org.springframework.util.Assert;
+import org.webbuilder.sql.*;
 
 import javax.annotation.Resource;
 import java.util.List;
@@ -33,19 +35,27 @@ public class DynamicFormServiceImpl implements DynamicFormService {
     @Resource
     protected FormService formService;
 
+    @Resource
+    protected HistoryService historyService;
+
     @Override
     public void deploy(Form form) throws Exception {
         Lock writeLock = lock.writeLock();
         try {
             writeLock.lock();
             TableMetaData metaData = formParser.parse(form);
-            List<Form> oldList = formService.select(new QueryParam().where("name", form.getName()).where("version", form.getVersion() - 1));
-            Form old = null;
-            if (oldList.size() > 0) old = oldList.get(0);
-            if (old != null)
-                dataBase.updateTable(metaData);
-            else
+            History history = historyService.selectLastHistoryByType("form.deploy." + form.getName());
+            //首次部署
+            if (history == null) {
                 dataBase.createTable(metaData);
+            } else {
+                Form lastDeploy = JSON.parseObject(history.getChange_after(), Form.class);
+                TableMetaData lastDeployMetaData = formParser.parse(lastDeploy);
+                //向上发布
+                dataBase.updateTable(lastDeployMetaData);//先放入旧的结构
+                //更新结构
+                dataBase.alterTable(metaData);
+            }
         } finally {
             writeLock.unlock();
         }
@@ -56,53 +66,167 @@ public class DynamicFormServiceImpl implements DynamicFormService {
         Lock writeLock = lock.writeLock();
         try {
             writeLock.lock();
+            dataBase.removeTable(form.getName());
         } finally {
             writeLock.unlock();
         }
     }
 
+    public Table getTableByName(String name) throws Exception {
+        Table table = dataBase.getTable(name.toUpperCase());
+        if (table == null)
+            table = dataBase.getTable(name.toLowerCase());
+        Assert.notNull(table, "表单[" + name + "]不存在");
+        return table;
+    }
+
     @Override
     public <T> PagerResult<T> selectPager(String name, QueryParam param) throws Exception {
         Lock readLock = lock.readLock();
+        PagerResult<T> result = new PagerResult<>();
         try {
             readLock.lock();
-            System.out.println("执行");
-            Thread.sleep(1000);
+            Table table = getTableByName(name);
+            Query query = table.createQuery();
+            QueryParamProxy proxy = QueryParamProxy.build(param);
+            int total = query.total(proxy);
+            result.setTotal(total);
+            param.rePaging(total);
+            proxy = QueryParamProxy.build(param);
+            result.setData(query.list(proxy));
         } finally {
             readLock.unlock();
         }
-        return null;
+        return result;
     }
 
     @Override
     public <T> List<T> select(String name, QueryParam param) throws Exception {
-        return null;
+        Lock readLock = lock.readLock();
+        try {
+            readLock.lock();
+            Table table = getTableByName(name);
+            Query query = table.createQuery();
+            param.setPaging(false);
+            QueryParamProxy proxy = QueryParamProxy.build(param);
+            return query.list(proxy);
+        } finally {
+            readLock.unlock();
+        }
     }
 
     @Override
     public int total(String name, QueryParam param) throws Exception {
-        return 0;
+        Lock readLock = lock.readLock();
+        try {
+            readLock.lock();
+            Table table = getTableByName(name);
+            Query query = table.createQuery();
+            param.setPaging(false);
+            QueryParamProxy proxy = QueryParamProxy.build(param);
+            return query.total(proxy);
+        } finally {
+            readLock.unlock();
+        }
     }
 
     @Override
-    public int insert(String name, Map<String, Object> data) throws Exception {
-        return 0;
+    public int insert(String name, InsertParam<Map<String, Object>> param) throws Exception {
+        Lock readLock = lock.readLock();
+        try {
+            readLock.lock();
+            Table table = getTableByName(name);
+            Insert insert = table.createInsert();
+            boolean success = insert.insert(InsertParamProxy.build(param));
+            return success ? 1 : 0;
+        } finally {
+            readLock.unlock();
+        }
     }
 
     @Override
-    public int delete(String name, Map<String, Object> data) throws Exception {
-        return 0;
+    public int delete(String name, DeleteParam where) throws Exception {
+        Lock readLock = lock.readLock();
+        try {
+            readLock.lock();
+            Table table = getTableByName(name);
+            Delete delete = table.createDelete();
+            return delete.delete(DeleteParamProxy.build(where));
+        } finally {
+            readLock.unlock();
+        }
     }
 
     @Override
-    public int update(String name, Map<String, Object> data) throws Exception {
-        return 0;
+    public int update(String name, UpdateParam<Map<String, Object>> param) throws Exception {
+        Lock readLock = lock.readLock();
+        try {
+            readLock.lock();
+            Table table = getTableByName(name);
+            Update update = table.createUpdate();
+            UpdateParamProxy paramProxy = UpdateParamProxy.build(param);
+            return update.update(paramProxy);
+        } finally {
+            readLock.unlock();
+        }
     }
 
     @Override
     public <T> T selectByPk(String name, Object pk) throws Exception {
-        return null;
+        Lock readLock = lock.readLock();
+        try {
+            readLock.lock();
+            Table table = getTableByName(name);
+            Object pk_name = table.getMetaData().attr("primaryKey");
+            if (pk_name == null) {
+                pk_name = "u_id";
+            }
+            Query query = table.createQuery();
+            QueryParamProxy proxy = new QueryParamProxy();
+            proxy.where(String.valueOf(pk_name), pk);
+            return query.single(proxy);
+        } finally {
+            readLock.unlock();
+        }
+    }
+
+    public static class QueryParamProxy extends org.webbuilder.sql.param.query.QueryParam {
+        public static QueryParamProxy build(QueryParam param) {
+            QueryParamProxy proxy = new QueryParamProxy();
+            proxy.where(param.getTerm());
+            proxy.exclude(param.getExcludes());
+            proxy.include(param.getIncludes());
+            proxy.orderBy("desc".equals(param.getSortOrder()), param.getSortField());
+            proxy.doPaging(param.getPageIndex(), param.getPageSize());
+            proxy.setPaging(param.isPaging());
+            return proxy;
+        }
+    }
+
+    public static class UpdateParamProxy extends org.webbuilder.sql.param.update.UpdateParam {
+        public static UpdateParamProxy build(UpdateParam<Map<String, Object>> param) {
+            UpdateParamProxy proxy = new UpdateParamProxy();
+            proxy.where(param.getTerm());
+            proxy.exclude(param.getExcludes());
+            proxy.include(param.getIncludes());
+            proxy.set(param.getData());
+            return proxy;
+        }
     }
 
+    public static class InsertParamProxy extends org.webbuilder.sql.param.insert.InsertParam {
+        public static InsertParamProxy build(InsertParam<Map<String, Object>> param) {
+            InsertParamProxy proxy = new InsertParamProxy();
+            proxy.values(param.getData());
+            return proxy;
+        }
+    }
 
+    public static class DeleteParamProxy extends org.webbuilder.sql.param.delete.DeleteParam {
+        public static DeleteParamProxy build(DeleteParam param) {
+            DeleteParamProxy proxy = new DeleteParamProxy();
+            proxy.where(param.getTerm());
+            return proxy;
+        }
+    }
 }

+ 2 - 0
hsweb-web-service-impl-common/src/main/java/org/hsweb/web/service/impl/form/FormParser.java

@@ -8,4 +8,6 @@ import org.webbuilder.sql.TableMetaData;
  */
 public interface FormParser {
     TableMetaData parse(Form form);
+
+    String parseHtml(Form form);
 }

+ 40 - 9
hsweb-web-service-impl-common/src/main/java/org/hsweb/web/service/impl/form/FormServiceImpl.java

@@ -1,20 +1,24 @@
 package org.hsweb.web.service.impl.form;
 
+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.form.Form;
-import org.hsweb.web.dao.GenericMapper;
+import org.hsweb.web.bean.po.history.History;
 import org.hsweb.web.dao.form.FormMapper;
-import org.hsweb.web.exception.BusinessException;
 import org.hsweb.web.service.form.DynamicFormService;
 import org.hsweb.web.service.form.FormService;
+import org.hsweb.web.service.history.HistoryService;
 import org.hsweb.web.service.impl.AbstractServiceImpl;
 import org.hsweb.web.utils.RandomUtil;
+import org.springframework.beans.factory.annotation.Autowired;
 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 org.springframework.util.Assert;
+import org.webbuilder.utils.common.StringUtils;
 
 import javax.annotation.Resource;
 import java.util.Date;
@@ -29,9 +33,15 @@ public class FormServiceImpl extends AbstractServiceImpl<Form, String> implement
 
     private static final String CACHE_KEY = "form";
 
+    @Autowired(required = false)
+    protected FormParser formParser = new CommonFormParser();
+
     @Resource
     private FormMapper formMapper;
 
+    @Resource
+    private HistoryService historyService;
+
     @Override
     protected FormMapper getMapper() {
         return formMapper;
@@ -60,18 +70,20 @@ public class FormServiceImpl extends AbstractServiceImpl<Form, String> implement
     @Override
     public String insert(Form data) throws Exception {
         List<Form> old = this.select(new QueryParam().where("name", data.getName()));
-        Assert.notNull(old, "表单 [" + data.getName() + "] 已存在!");
+        Assert.isTrue(old.isEmpty(), "表单 [" + data.getName() + "] 已存在!");
         data.setCreate_date(new Date());
         data.setVersion(1);
+        if (StringUtils.isNullOrEmpty(data.getU_id()))
+            data.setU_id(RandomUtil.randomChar());
         super.insert(data);
         return data.getU_id();
     }
 
     @Override
-    @CacheEvict(value = CACHE_KEY, key = "#data.u_id")
+    @CacheEvict(value = {CACHE_KEY, CACHE_KEY + "_html_view"}, key = "#data.u_id")
     public int update(Form data) throws Exception {
         Form old = this.selectByPk(data.getU_id());
-        Assert.isNull(old, "表单不存在!");
+        Assert.notNull(old, "表单不存在!");
         data.setUpdate_date(new Date());
         return super.update(data);
     }
@@ -80,8 +92,8 @@ public class FormServiceImpl extends AbstractServiceImpl<Form, String> implement
     @CacheEvict(value = CACHE_KEY, key = "#id")
     public int delete(String id) throws Exception {
         Form old = this.selectByPk(id);
-        Assert.isNull(old, "表单不存在!");
-        Assert.isTrue(old.isUsing(), "表单正在使用,无法删除!");
+        Assert.notNull(old, "表单不存在!");
+        Assert.isTrue(!old.isUsing(), "表单正在使用,无法删除!");
         return super.delete(id);
     }
 
@@ -99,6 +111,7 @@ public class FormServiceImpl extends AbstractServiceImpl<Form, String> implement
 
     @Override
     @Transactional(rollbackFor = Throwable.class)
+    @CacheEvict(value = {CACHE_KEY + "_html"}, allEntries = true)
     public void deploy(String formId) throws Exception {
         Form old = this.selectByPk(formId);
         Assert.notNull(old, "表单不存在");
@@ -111,6 +124,13 @@ public class FormServiceImpl extends AbstractServiceImpl<Form, String> implement
         old.setUsing(true);
         dynamicFormService.deploy(old);
         getMapper().update(new UpdateParam<>(old).includes("using").where("u_id", old.getU_id()));
+        //加入发布历史记录
+        History history = History.newInstace("form.deploy." + old.getName());
+        history.setPrimary_key_name("u_id");
+        history.setPrimary_key_value(old.getU_id());
+        history.setChange_before("{}");
+        history.setChange_after(JSON.toJSONString(old));
+        historyService.insert(history);
     }
 
     @Override
@@ -126,7 +146,18 @@ public class FormServiceImpl extends AbstractServiceImpl<Form, String> implement
     }
 
     @Override
-    public String createHtml(String formId) throws Exception {
-        return null;
+    @Cacheable(value = CACHE_KEY + "_html", key = "#name")
+    public String createDeployHtml(String name) throws Exception {
+        History history = historyService.selectLastHistoryByType("form.deploy." + name);
+        Assert.notNull(history, "表单不存在");
+        return formParser.parseHtml(JSON.parseObject(history.getChange_after(), Form.class));
+    }
+
+    @Override
+    @Cacheable(value = CACHE_KEY + "_html_view", key = "#name")
+    public String createViewHtml(String formId) throws Exception {
+        Form form = this.selectByPk(formId);
+        Assert.notNull(form, "表单不存在");
+        return formParser.parseHtml(form);
     }
 }

+ 36 - 0
hsweb-web-service-impl-common/src/main/java/org/hsweb/web/service/impl/history/HistoryServiceImpl.java

@@ -0,0 +1,36 @@
+package org.hsweb.web.service.impl.history;
+
+import org.hsweb.web.bean.common.QueryParam;
+import org.hsweb.web.bean.po.history.History;
+import org.hsweb.web.dao.history.HistoryMapper;
+import org.hsweb.web.service.history.HistoryService;
+import org.hsweb.web.service.impl.AbstractServiceImpl;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * Created by zhouhao on 16-4-22.
+ */
+@Service("historyService")
+public class HistoryServiceImpl extends AbstractServiceImpl<History, String> implements HistoryService {
+    @Resource
+    public HistoryMapper historyMapper;
+
+    @Override
+    protected HistoryMapper getMapper() {
+        return historyMapper;
+    }
+
+    @Override
+    public History selectLastHistoryByType(String type) throws Exception {
+        QueryParam queryParam = new QueryParam()
+                .where("type", type)
+                .doPaging(0, 1)
+                .orderBy("create_date", false);
+        List<History> history = historyMapper.select(queryParam);
+        if (history.size() == 1) return history.get(0);
+        return null;
+    }
+}

+ 0 - 27
hsweb-web-service-impl-common/src/test/java/org/hsweb/web/service/impl/DataBaseAutoConfiguration.java

@@ -1,27 +0,0 @@
-package org.hsweb.web.service.impl;
-
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.webbuilder.sql.DataBase;
-import org.webbuilder.sql.DataBaseMetaData;
-import org.webbuilder.sql.support.OracleDataBaseMetaData;
-import org.webbuilder.sql.support.common.CommonDataBase;
-import org.webbuilder.sql.support.executor.SqlExecutor;
-
-import javax.annotation.Resource;
-
-/**
- * Created by zhouhao on 16-4-20.
- */
-@Configuration
-public class DataBaseAutoConfiguration {
-    @Resource
-    private SqlExecutor sqlExecutor;
-
-    @Bean
-    public DataBase getDataBase() {
-        DataBaseMetaData dataBaseMetaData = new OracleDataBaseMetaData();
-        DataBase dataBase = new CommonDataBase(dataBaseMetaData, sqlExecutor);
-        return dataBase;
-    }
-}