From 2b759ab5e5d708c4c9a6b4a093103c026667cf38 Mon Sep 17 00:00:00 2001
From: wuxw <928255095@qq.com>
Date: 星期一, 06 五月 2019 11:33:59 +0800
Subject: [PATCH] 对组件传参重新封装

---
 WebService/src/main/java/com/java110/web/core/VueComponentElement.java |  132 ++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 116 insertions(+), 16 deletions(-)

diff --git a/WebService/src/main/java/com/java110/web/core/VueComponentElement.java b/WebService/src/main/java/com/java110/web/core/VueComponentElement.java
index bc9adf7..53b4a00 100644
--- a/WebService/src/main/java/com/java110/web/core/VueComponentElement.java
+++ b/WebService/src/main/java/com/java110/web/core/VueComponentElement.java
@@ -1,11 +1,14 @@
 package com.java110.web.core;
 
-import com.alibaba.fastjson.JSONObject;
-import com.java110.web.smo.impl.LoginServiceSMOImpl;
+import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.thymeleaf.Arguments;
-import org.thymeleaf.dom.*;
+import org.thymeleaf.dom.Document;
+import org.thymeleaf.dom.Element;
+import org.thymeleaf.dom.Macro;
+import org.thymeleaf.dom.Node;
+import org.thymeleaf.exceptions.TemplateProcessingException;
 import org.thymeleaf.processor.element.AbstractMarkupSubstitutionElementProcessor;
 import org.thymeleaf.util.DOMUtils;
 
@@ -19,7 +22,11 @@
  */
 public class VueComponentElement extends AbstractMarkupSubstitutionElementProcessor {
 
-    private final static Logger logger = LoggerFactory.getLogger(VueComponentElement.class);
+    private static Logger logger = LoggerFactory.getLogger(VueComponentElement.class);
+
+    private static final String DIV_PROPERTY_COMPONENT = "data-component";
+
+    private static final int DEFAULT_PRECEDENCE = 1000;
 
 
     protected VueComponentElement(String elementName) {
@@ -33,26 +40,35 @@
         List<Node> nodes = new ArrayList<>();
         //鑾峰彇妯℃澘鍚嶇О
         String componentName = element.getAttributeValue("name");
-        String html = VueComponentTemplate.findTemplateByComponentCode(componentName+"."+VueComponentTemplate.COMPONENT_HTML);
-        if(html == null){
-            throw new RuntimeException("鍦ㄧ紦瀛樹腑鏈壘鍒扮粍浠躲��"+componentName+"銆�");
+
+        logger.debug("姝e湪瑙f瀽缁勪欢{}", componentName);
+        String html = VueComponentTemplate.findTemplateByComponentCode(componentName + "." + VueComponentTemplate.COMPONENT_HTML);
+        if (html == null) {
+            throw new RuntimeException("鍦ㄧ紦瀛樹腑鏈壘鍒扮粍浠躲��" + componentName + "銆�");
         }
-        List<Node> tmpNodes = DOMUtils.getHtml5DOMFor(new StringReader(html)).getChildren();
-        for(Node tmpNode : tmpNodes) {
+        //List<Node> tmpNodes = DOMUtils.getHtml5DOMFor(new StringReader(html)).getChildren();
+        Document tmpDoc = DOMUtils.getLegacyHTML5DOMFor(new StringReader(html));
+        List<Node> tmpNodes = tmpDoc.getChildren();
+
+        addDataComponent(tmpDoc, componentName);
+        for (Node tmpNode : tmpNodes) {
             nodes.add(tmpNode);
         }
         //css
-        String css = VueComponentTemplate.findTemplateByComponentCode(componentName+"."+VueComponentTemplate.COMPONENT_CSS);
-        if(css != null){
-            css = "<style type=\"text/css\">" + css +"</style>";
+        String css = VueComponentTemplate.findTemplateByComponentCode(componentName + "." + VueComponentTemplate.COMPONENT_CSS);
+        if (css != null) {
+            css = "<style type=\"text/css\">" + css + "</style>";
             Node nodeCss = new Macro(css);
             nodes.add(nodeCss);
         }
 
         //js
-        String js = VueComponentTemplate.findTemplateByComponentCode(componentName+"."+VueComponentTemplate.COMPONENT_JS);
-        if(js != null){
-            js = "<script type=\"text/javascript\">" + js +"</script>";
+        String js = VueComponentTemplate.findTemplateByComponentCode(componentName + "." + VueComponentTemplate.COMPONENT_JS);
+        if (js != null) {
+
+            js = dealJs(js, element);
+            js = dealJsAddComponentCode(js, element);
+            js = "<script type=\"text/javascript\">//<![CDATA[ \n" + js + "//]]>\n</script>";
             Node nodeJs = new Macro(js);
             nodes.add(nodeJs);
         }
@@ -61,8 +77,92 @@
         return nodes;
     }
 
+    /**
+     * 澶勭悊js
+     *
+     * @param element 椤甸潰鍏冪礌
+     * @param js      js鏂囦欢鍐呭
+     * @return js 鏂囦欢鍐呭
+     */
+    private String dealJs(String js, Element element) {
+
+        //鍦╦s 涓娴媝ropTypes 灞炴��
+        if (!js.contains("propTypes")) {
+            return js;
+        }
+
+        //瑙f瀽propTypes淇℃伅
+        String tmpProTypes = js.substring(js.indexOf("propTypes"));
+        tmpProTypes = tmpProTypes.substring(tmpProTypes.indexOf("{") + 1, tmpProTypes.indexOf("}")).trim();
+
+        if (StringUtils.isEmpty(tmpProTypes)) {
+            return js;
+        }
+
+        String[] tmpType = tmpProTypes.split(",");
+        StringBuffer propsJs = new StringBuffer("\nvar $props = {};\n");
+        for (String type : tmpType) {
+            if (StringUtils.isEmpty(type) || !type.contains(":")) {
+                continue;
+            }
+            String[] types = type.split(":");
+            String attrKey = types[0].replace(" ", "")
+                    .replace("\n", "")
+                    .replace("\r", "");
+            if (!element.hasAttribute(attrKey)) {
+                String componentName = element.getAttributeValue("name");
+                logger.error("缁勪欢" + componentName + "鏈厤缃粍浠跺睘鎬� " + attrKey);
+                throw new TemplateProcessingException("缁勪欢[" + componentName + "]鏈厤缃粍浠跺睘鎬�" + attrKey);
+            }
+            String vcType = element.getAttributeValue(attrKey);
+            if (types[1].equals("vc.propTypes.string")) {
+                vcType = "'" + vcType + "'";
+            }
+            propsJs.append("$props." + attrKey + "=" + vcType + ";\n");
+        }
+
+        //灏唒ropsJs 鎻掑叆鍒� 绗竴涓� { 涔嬪悗
+        int position = js.indexOf("{");
+        if (position < 0) {
+            String componentName = element.getAttributeValue("name");
+            logger.error("缁勪欢" + componentName + "瀵瑰簲js 鏈寘鍚� {}  ");
+            throw new TemplateProcessingException("缁勪欢" + componentName + "瀵瑰簲js 鏈寘鍚� {}  ");
+        }
+        js = new StringBuffer(js).insert(position + 1, propsJs).toString();
+        return js;
+    }
+
+    /**
+     * 澶勭悊js 鍙橀噺鍜� 鏂规硶閮藉姞鍏� 缁勪欢缂栫爜
+     *
+     * @param element 椤甸潰鍏冪礌
+     * @param js      js鏂囦欢鍐呭
+     * @return js 鏂囦欢鍐呭
+     */
+    private String dealJsAddComponentCode(String js, Element element) {
+
+        if (!element.hasAttribute("code")) {
+            return js;
+        }
+
+        String code = element.getAttributeValue("code");
+
+        return js.replace("@vc_", code);
+    }
+
+    /**
+     * 鍔犲叆缁勪欢鍚嶇О鍒� HTML涓� 鏂逛究瀹氫綅闂
+     *
+     * @param tmpDoc        椤甸潰鑺傜偣
+     * @param componentCode 缁勪欢缂栫爜
+     */
+    private void addDataComponent(Document tmpDoc, String componentCode) {
+        Element tmpElement = tmpDoc.getFirstElementChild();
+        tmpElement.setAttribute(DIV_PROPERTY_COMPONENT, componentCode);
+    }
+
     @Override
     public int getPrecedence() {
-        return 1000;
+        return DEFAULT_PRECEDENCE;
     }
 }

--
Gitblit v1.8.0