From ebf15ccdaf167d1946773e77de1e618ae87080e8 Mon Sep 17 00:00:00 2001
From: 吴学文 <wuxuewen@wuxuewendeMacBook-Pro.local>
Date: 星期六, 18 五月 2019 00:04:23 +0800
Subject: [PATCH] 修改编辑业主时的 数据校验 bug
---
WebService/src/main/java/com/java110/web/core/VueComponentElement.java | 134 +++++++++++++++++++++++++++++++++++++++-----
1 files changed, 118 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..89443da 100644
--- a/WebService/src/main/java/com/java110/web/core/VueComponentElement.java
+++ b/WebService/src/main/java/com/java110/web/core/VueComponentElement.java
@@ -1,16 +1,20 @@
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;
import java.io.StringReader;
import java.util.ArrayList;
+import java.util.Date;
import java.util.List;
/**
@@ -19,7 +23,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,36 +41,130 @@
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, new Date().getTime());
+ 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);
}
+ logger.debug("瑙f瀽瀹屾垚缁勪欢{},{}", componentName, new Date().getTime());
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