o2sword 5 лет назад
Родитель
Сommit
382b59db96
17 измененных файлов с 921 добавлено и 4 удалено
  1. 3 2
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/x_portal_assemble_designer.java
  2. 4 2
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/x_portal_assemble_surface.java
  3. 54 0
      o2server/x_portal_assemble_designer/src/main/java/com/x/portal/assemble/designer/jaxrs/page/ActionCreate.java
  4. 54 0
      o2server/x_portal_assemble_designer/src/main/java/com/x/portal/assemble/designer/jaxrs/page/ActionEdit.java
  5. 8 0
      o2server/x_portal_assemble_surface/pom.xml
  6. 20 0
      o2server/x_portal_assemble_surface/src/main/java/com/x/portal/assemble/surface/Business.java
  7. 73 0
      o2server/x_portal_assemble_surface/src/main/java/com/x/portal/assemble/surface/factory/ElementFactory.java
  8. 21 0
      o2server/x_portal_assemble_surface/src/main/java/com/x/portal/assemble/surface/factory/cms/CmsFactory.java
  9. 17 0
      o2server/x_portal_assemble_surface/src/main/java/com/x/portal/assemble/surface/factory/cms/ScriptFactory.java
  10. 21 0
      o2server/x_portal_assemble_surface/src/main/java/com/x/portal/assemble/surface/factory/process/ProcessFactory.java
  11. 17 0
      o2server/x_portal_assemble_surface/src/main/java/com/x/portal/assemble/surface/factory/process/ScriptFactory.java
  12. 264 0
      o2server/x_portal_assemble_surface/src/main/java/com/x/portal/assemble/surface/jaxrs/page/BaseAction.java
  13. 36 0
      o2server/x_portal_assemble_surface/src/main/java/com/x/portal/assemble/surface/jaxrs/page/PageAction.java
  14. 123 0
      o2server/x_portal_assemble_surface/src/main/java/com/x/portal/assemble/surface/jaxrs/page/V2Get.java
  15. 123 0
      o2server/x_portal_assemble_surface/src/main/java/com/x/portal/assemble/surface/jaxrs/page/V2GetMobile.java
  16. 26 0
      o2server/x_portal_core_entity/src/main/java/com/x/portal/core/entity/Page.java
  17. 57 0
      o2server/x_portal_core_entity/src/main/java/com/x/portal/core/entity/PageProperties.java

+ 3 - 2
o2server/x_base_core_project/src/main/java/com/x/base/core/project/x_portal_assemble_designer.java

@@ -7,7 +7,8 @@ import com.x.base.core.project.annotation.ModuleType;
 @Module(type = ModuleType.ASSEMBLE, category = ModuleCategory.OFFICIAL, name = "门户设计", packageName = "com.x.portal.assemble.designer", containerEntities = {
 		"com.x.portal.core.entity.Portal", "com.x.portal.core.entity.Widget", "com.x.portal.core.entity.Page",
 		"com.x.portal.core.entity.Script", "com.x.portal.core.entity.File",
-		"com.x.portal.core.entity.TemplatePage" }, storeJars = { "x_organization_core_entity",
-				"x_organization_core_express", "x_portal_core_entity" })
+		"com.x.portal.core.entity.TemplatePage", "com.x.cms.core.entity.element.Script",
+		"com.x.processplatform.core.entity.element.Script" }, storeJars = { "x_organization_core_entity",
+				"x_organization_core_express", "x_portal_core_entity", "x_cms_core_entity", "x_processplatform_core_entity" })
 public class x_portal_assemble_designer extends Deployable {
 }

+ 4 - 2
o2server/x_base_core_project/src/main/java/com/x/base/core/project/x_portal_assemble_surface.java

@@ -6,7 +6,9 @@ import com.x.base.core.project.annotation.ModuleType;
 
 @Module(type = ModuleType.ASSEMBLE, category = ModuleCategory.OFFICIAL, name = "门户", packageName = "com.x.portal.assemble.surface", containerEntities = {
 		"com.x.portal.core.entity.Portal", "com.x.portal.core.entity.Widget", "com.x.portal.core.entity.Page",
-		"com.x.portal.core.entity.Script", "com.x.portal.core.entity.File" }, storeJars = {
-				"x_organization_core_entity", "x_organization_core_express", "x_portal_core_entity" })
+		"com.x.portal.core.entity.Script", "com.x.portal.core.entity.File", "com.x.cms.core.entity.element.Script",
+		"com.x.processplatform.core.entity.element.Script" }, storeJars = {
+		"x_organization_core_entity", "x_organization_core_express", "x_portal_core_entity", "x_cms_core_entity",
+		"x_processplatform_core_entity" })
 public class x_portal_assemble_surface extends Deployable {
 }

+ 54 - 0
o2server/x_portal_assemble_designer/src/main/java/com/x/portal/assemble/designer/jaxrs/page/ActionCreate.java

@@ -1,5 +1,6 @@
 package com.x.portal.assemble.designer.jaxrs.page;
 
+import com.x.base.core.project.annotation.FieldDescribe;
 import com.x.base.core.project.cache.CacheManager;
 import org.apache.commons.lang3.StringUtils;
 
@@ -17,6 +18,11 @@ import com.x.portal.assemble.designer.Business;
 import com.x.portal.core.entity.Page;
 import com.x.portal.core.entity.Portal;
 
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
 class ActionCreate extends BaseAction {
 
 	ActionResult<Wo> execute(EffectivePerson effectivePerson, JsonElement jsonElement) throws Exception {
@@ -32,6 +38,10 @@ class ActionCreate extends BaseAction {
 			Page page = Wi.copier.copy(wi);
 			this.checkName(business, page);
 			this.checkAlias(business, page);
+			page.getProperties().setRelatedWidgetList(wi.getRelatedWidgetList());
+			page.getProperties().setMobileRelatedWidgetList(wi.getMobileRelatedWidgetList());
+			page.getProperties().setRelatedScriptMap(wi.getRelatedScriptMap());
+			page.getProperties().setMobileRelatedScriptMap(wi.getMobileRelatedScriptMap());
 			emc.persist(page, CheckPersistType.all);
 			/** 更新首页 */
 			if (this.isBecomeFirstPage(business, portal, page)) {
@@ -59,6 +69,50 @@ class ActionCreate extends BaseAction {
 
 		static WrapCopier<Wi, Page> copier = WrapCopierFactory.wi(Wi.class, Page.class, null,
 				JpaObject.FieldsUnmodifyExcludeId);
+
+		@FieldDescribe("关联Widget.")
+		private List<String> relatedWidgetList = new ArrayList<>();
+
+		@FieldDescribe("移动端关联Widget.")
+		private List<String> mobileRelatedWidgetList = new ArrayList<>();
+
+		@FieldDescribe("关联脚本.")
+		private Map<String, String> relatedScriptMap = new LinkedHashMap<>();
+
+		@FieldDescribe("移动端关联脚本.")
+		private Map<String, String> mobileRelatedScriptMap = new LinkedHashMap<>();
+
+		public List<String> getRelatedWidgetList() {
+			return this.relatedWidgetList == null ? new ArrayList<>() : this.relatedWidgetList;
+		}
+
+		public List<String> getMobileRelatedWidgetList() {
+			return this.mobileRelatedWidgetList == null ? new ArrayList<>() : this.mobileRelatedWidgetList;
+		}
+
+		public Map<String, String> getRelatedScriptMap() {
+			return this.relatedScriptMap == null ? new LinkedHashMap<>() : this.relatedScriptMap;
+		}
+
+		public Map<String, String> getMobileRelatedScriptMap() {
+			return this.mobileRelatedScriptMap == null ? new LinkedHashMap<>() : this.mobileRelatedScriptMap;
+		}
+
+		public void setRelatedWidgetList(List<String> relatedWidgetList) {
+			this.relatedWidgetList = relatedWidgetList;
+		}
+
+		public void setMobileRelatedWidgetList(List<String> mobileRelatedWidgetList) {
+			this.mobileRelatedWidgetList = mobileRelatedWidgetList;
+		}
+
+		public void setRelatedScriptMap(Map<String, String> relatedScriptMap) {
+			this.relatedScriptMap = relatedScriptMap;
+		}
+
+		public void setMobileRelatedScriptMap(Map<String, String> mobileRelatedScriptMap) {
+			this.mobileRelatedScriptMap = mobileRelatedScriptMap;
+		}
 	}
 
 	public static class Wo extends WoId {

+ 54 - 0
o2server/x_portal_assemble_designer/src/main/java/com/x/portal/assemble/designer/jaxrs/page/ActionEdit.java

@@ -1,5 +1,6 @@
 package com.x.portal.assemble.designer.jaxrs.page;
 
+import com.x.base.core.project.annotation.FieldDescribe;
 import com.x.base.core.project.cache.CacheManager;
 import org.apache.commons.lang3.StringUtils;
 
@@ -17,6 +18,11 @@ import com.x.portal.assemble.designer.Business;
 import com.x.portal.core.entity.Page;
 import com.x.portal.core.entity.Portal;
 
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
 class ActionEdit extends BaseAction {
 	ActionResult<Wo> execute(EffectivePerson effectivePerson, String id, JsonElement jsonElement) throws Exception {
 		ActionResult<Wo> result = new ActionResult<>();
@@ -38,6 +44,10 @@ class ActionEdit extends BaseAction {
 			Wi.copier.copy(wi, page);
 			this.checkName(business, page);
 			this.checkAlias(business, page);
+			page.getProperties().setRelatedWidgetList(wi.getRelatedWidgetList());
+			page.getProperties().setMobileRelatedWidgetList(wi.getMobileRelatedWidgetList());
+			page.getProperties().setRelatedScriptMap(wi.getRelatedScriptMap());
+			page.getProperties().setMobileRelatedScriptMap(wi.getMobileRelatedScriptMap());
 			emc.check(page, CheckPersistType.all);
 			/** 更新首页 */
 			if (this.isBecomeFirstPage(business, portal, page)) {
@@ -64,6 +74,50 @@ class ActionEdit extends BaseAction {
 		private static final long serialVersionUID = 6624639107781167248L;
 
 		static WrapCopier<Wi, Page> copier = WrapCopierFactory.wi(Wi.class, Page.class, null, JpaObject.FieldsUnmodify);
+
+		@FieldDescribe("关联Widget.")
+		private List<String> relatedWidgetList = new ArrayList<>();
+
+		@FieldDescribe("移动端关联Widget.")
+		private List<String> mobileRelatedWidgetList = new ArrayList<>();
+
+		@FieldDescribe("关联脚本.")
+		private Map<String, String> relatedScriptMap = new LinkedHashMap<>();
+
+		@FieldDescribe("移动端关联脚本.")
+		private Map<String, String> mobileRelatedScriptMap = new LinkedHashMap<>();
+
+		public List<String> getRelatedWidgetList() {
+			return this.relatedWidgetList == null ? new ArrayList<>() : this.relatedWidgetList;
+		}
+
+		public List<String> getMobileRelatedWidgetList() {
+			return this.mobileRelatedWidgetList == null ? new ArrayList<>() : this.mobileRelatedWidgetList;
+		}
+
+		public Map<String, String> getRelatedScriptMap() {
+			return this.relatedScriptMap == null ? new LinkedHashMap<>() : this.relatedScriptMap;
+		}
+
+		public Map<String, String> getMobileRelatedScriptMap() {
+			return this.mobileRelatedScriptMap == null ? new LinkedHashMap<>() : this.mobileRelatedScriptMap;
+		}
+
+		public void setRelatedWidgetList(List<String> relatedWidgetList) {
+			this.relatedWidgetList = relatedWidgetList;
+		}
+
+		public void setMobileRelatedWidgetList(List<String> mobileRelatedWidgetList) {
+			this.mobileRelatedWidgetList = mobileRelatedWidgetList;
+		}
+
+		public void setRelatedScriptMap(Map<String, String> relatedScriptMap) {
+			this.relatedScriptMap = relatedScriptMap;
+		}
+
+		public void setMobileRelatedScriptMap(Map<String, String> mobileRelatedScriptMap) {
+			this.mobileRelatedScriptMap = mobileRelatedScriptMap;
+		}
 	}
 
 	public static class Wo extends WoId {

+ 8 - 0
o2server/x_portal_assemble_surface/pom.xml

@@ -24,6 +24,14 @@
 			<groupId>o2oa</groupId>
 			<artifactId>x_organization_core_express</artifactId>
 		</dependency>
+		<dependency>
+			<groupId>o2oa</groupId>
+			<artifactId>x_processplatform_core_entity</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>o2oa</groupId>
+			<artifactId>x_cms_core_entity</artifactId>
+		</dependency>
 		<dependency>
 			<groupId>o2oa</groupId>
 			<artifactId>x_general_core_entity</artifactId>

+ 20 - 0
o2server/x_portal_assemble_surface/src/main/java/com/x/portal/assemble/surface/Business.java

@@ -7,6 +7,8 @@ import com.x.portal.assemble.surface.factory.PageFactory;
 import com.x.portal.assemble.surface.factory.PortalFactory;
 import com.x.portal.assemble.surface.factory.ScriptFactory;
 import com.x.portal.assemble.surface.factory.WidgetFactory;
+import com.x.portal.assemble.surface.factory.cms.CmsFactory;
+import com.x.portal.assemble.surface.factory.process.ProcessFactory;
 
 public class Business {
 
@@ -74,4 +76,22 @@ public class Business {
 		return file;
 	}
 
+	private CmsFactory cms;
+
+	public CmsFactory cms() throws Exception {
+		if (null == this.cms) {
+			this.cms = new CmsFactory(this);
+		}
+		return cms;
+	}
+
+	private ProcessFactory process;
+
+	public ProcessFactory process() throws Exception {
+		if (null == this.process) {
+			this.process = new ProcessFactory(this);
+		}
+		return process;
+	}
+
 }

+ 73 - 0
o2server/x_portal_assemble_surface/src/main/java/com/x/portal/assemble/surface/factory/ElementFactory.java

@@ -0,0 +1,73 @@
+package com.x.portal.assemble.surface.factory;
+
+import com.x.base.core.entity.JpaObject;
+import com.x.base.core.project.cache.Cache.CacheCategory;
+import com.x.base.core.project.cache.Cache.CacheKey;
+import com.x.base.core.project.cache.CacheManager;
+import com.x.portal.assemble.surface.AbstractFactory;
+import com.x.portal.assemble.surface.Business;
+import com.x.portal.core.entity.Page;
+import com.x.portal.core.entity.Portal;
+import net.sf.ehcache.Ehcache;
+import java.util.*;
+
+public abstract class ElementFactory extends AbstractFactory {
+
+	protected Ehcache cache;
+
+	public ElementFactory(Business abstractBusiness) throws Exception {
+		super(abstractBusiness);
+	}
+
+	@SuppressWarnings("unchecked")
+	protected <T extends JpaObject> T pick(String flag, Class<T> clz) throws Exception {
+		CacheCategory cacheCategory = new CacheCategory(clz);
+		CacheKey cacheKey = new CacheKey(flag);
+		T t = null;
+		Optional<?> optional = CacheManager.get(cacheCategory, cacheKey);
+		if (optional.isPresent()) {
+			t = (T) optional.get();
+		} else {
+			t = this.entityManagerContainer().flag(flag, clz);
+			if (t != null) {
+				this.entityManagerContainer().get(clz).detach(t);
+				CacheManager.put(cacheCategory, cacheKey, t);
+			}
+		}
+		return t;
+	}
+
+	protected <T extends JpaObject> List<T> pick(Collection<String> flags, Class<T> clz) throws Exception {
+		List<T> list = new ArrayList<>();
+		for (String str : flags) {
+			T t = pick(str, clz);
+			if (null != t) {
+				list.add(t);
+			}
+		}
+		return list;
+	}
+
+	@SuppressWarnings("unchecked")
+	protected <T extends JpaObject> T pick(Portal portal, String flag, Class<T> clz) throws Exception {
+		if (null == portal) {
+			return null;
+		}
+		CacheCategory cacheCategory = new CacheCategory(clz);
+		CacheKey cacheKey = new CacheKey(portal.getId(), flag);
+		T t = null;
+		Optional<?> optional = CacheManager.get(cacheCategory, cacheKey);
+		if (optional.isPresent()) {
+			t = (T) optional.get();
+		} else {
+			t = this.entityManagerContainer().restrictFlag(flag, clz, Page.portal_FIELDNAME,
+					portal.getId());
+			if (t != null) {
+				this.entityManagerContainer().get(clz).detach(t);
+				CacheManager.put(cacheCategory, cacheKey, t);
+			}
+		}
+		return t;
+	}
+
+}

+ 21 - 0
o2server/x_portal_assemble_surface/src/main/java/com/x/portal/assemble/surface/factory/cms/CmsFactory.java

@@ -0,0 +1,21 @@
+package com.x.portal.assemble.surface.factory.cms;
+
+import com.x.portal.assemble.surface.AbstractFactory;
+import com.x.portal.assemble.surface.Business;
+
+public class CmsFactory extends AbstractFactory {
+
+	public CmsFactory(Business abstractBusiness) throws Exception {
+		super(abstractBusiness);
+	}
+
+	private ScriptFactory script;
+
+	public ScriptFactory script() throws Exception {
+		if (null == this.script) {
+			this.script = new ScriptFactory(this.business());
+		}
+		return script;
+	}
+
+}

+ 17 - 0
o2server/x_portal_assemble_surface/src/main/java/com/x/portal/assemble/surface/factory/cms/ScriptFactory.java

@@ -0,0 +1,17 @@
+package com.x.portal.assemble.surface.factory.cms;
+
+import com.x.cms.core.entity.element.Script;
+import com.x.portal.assemble.surface.Business;
+import com.x.portal.assemble.surface.factory.ElementFactory;
+
+public class ScriptFactory extends ElementFactory {
+
+	public ScriptFactory(Business abstractBusiness) throws Exception {
+		super(abstractBusiness);
+	}
+
+	public Script pick(String flag) throws Exception {
+		return this.pick(flag, Script.class);
+	}
+
+}

+ 21 - 0
o2server/x_portal_assemble_surface/src/main/java/com/x/portal/assemble/surface/factory/process/ProcessFactory.java

@@ -0,0 +1,21 @@
+package com.x.portal.assemble.surface.factory.process;
+
+import com.x.portal.assemble.surface.AbstractFactory;
+import com.x.portal.assemble.surface.Business;
+
+public class ProcessFactory extends AbstractFactory {
+
+	public ProcessFactory(Business abstractBusiness) throws Exception {
+		super(abstractBusiness);
+	}
+
+	private ScriptFactory script;
+
+	public ScriptFactory script() throws Exception {
+		if (null == this.script) {
+			this.script = new ScriptFactory(this.business());
+		}
+		return script;
+	}
+
+}

+ 17 - 0
o2server/x_portal_assemble_surface/src/main/java/com/x/portal/assemble/surface/factory/process/ScriptFactory.java

@@ -0,0 +1,17 @@
+package com.x.portal.assemble.surface.factory.process;
+
+import com.x.processplatform.core.entity.element.Script;
+import com.x.portal.assemble.surface.Business;
+import com.x.portal.assemble.surface.factory.ElementFactory;
+
+public class ScriptFactory extends ElementFactory {
+
+	public ScriptFactory(Business abstractBusiness) throws Exception {
+		super(abstractBusiness);
+	}
+
+	public Script pick(String flag) throws Exception {
+		return this.pick(flag, Script.class);
+	}
+
+}

+ 264 - 0
o2server/x_portal_assemble_surface/src/main/java/com/x/portal/assemble/surface/jaxrs/page/BaseAction.java

@@ -1,5 +1,9 @@
 package com.x.portal.assemble.surface.jaxrs.page;
 
+import com.x.base.core.project.gson.GsonPropertyObject;
+import com.x.base.core.project.jaxrs.WoMaxAgeFastETag;
+import com.x.portal.core.entity.Script;
+import com.x.portal.core.entity.Widget;
 import org.apache.commons.lang3.StringUtils;
 
 import com.x.base.core.project.config.Config;
@@ -7,6 +11,9 @@ import com.x.base.core.project.jaxrs.StandardJaxrsAction;
 import com.x.portal.core.entity.Page;
 import com.x.base.core.project.cache.Cache.CacheCategory;
 
+import java.util.HashMap;
+import java.util.Map;
+
 abstract class BaseAction extends StandardJaxrsAction {
 
 	CacheCategory pageCache = new CacheCategory(Page.class);
@@ -16,4 +23,261 @@ abstract class BaseAction extends StandardJaxrsAction {
 				&& StringUtils.equals(id, Config.portal().getIndexPage().getPage()));
 	}
 
+	CacheCategory cacheCategory = new CacheCategory(Page.class, Widget.class, Script.class, com.x.processplatform.core.entity.element.Script.class,
+			com.x.cms.core.entity.element.Script.class);
+
+	public static class AbstractWo extends WoMaxAgeFastETag {
+
+		private static final long serialVersionUID = -246989645483328034L;
+
+		private RelatedPage page;
+
+		private Map<String, RelatedWidget> relatedWidgetMap = new HashMap<>();
+
+		private Map<String, RelatedScript> relatedScriptMap = new HashMap<>();
+
+		public RelatedPage getPage() {
+			return page;
+		}
+
+		public void setPage(RelatedPage page) {
+			this.page = page;
+		}
+
+		public Map<String, RelatedWidget> getRelatedWidgetMap() {
+			return relatedWidgetMap;
+		}
+
+		public void setRelatedWidgetMap(Map<String, RelatedWidget> relatedWidgetMap) {
+			this.relatedWidgetMap = relatedWidgetMap;
+		}
+
+		public Map<String, RelatedScript> getRelatedScriptMap() {
+			return relatedScriptMap;
+		}
+
+		public void setRelatedScriptMap(Map<String, RelatedScript> relatedScriptMap) {
+			this.relatedScriptMap = relatedScriptMap;
+		}
+
+	}
+
+	public static class RelatedPage extends GsonPropertyObject {
+
+		private static final long serialVersionUID = 7525243539062813646L;
+
+		public RelatedPage() {
+
+		}
+
+		public RelatedPage(Page page, String data) {
+			this.id = page.getId();
+			this.alias = page.getAlias();
+			this.name = page.getName();
+			this.portal = page.getPortal();
+			this.hasMobile = page.getHasMobile();
+			this.data = data;
+		}
+
+		private String id;
+		private String alias;
+		private String name;
+		private String portal;
+		private Boolean hasMobile;
+		private String data;
+
+		public String getPortal() {
+			return portal;
+		}
+
+		public void setPortal(String portal) {
+			this.portal = portal;
+		}
+
+		public Boolean getHasMobile() {
+			return hasMobile;
+		}
+
+		public void setHasMobile(Boolean hasMobile) {
+			this.hasMobile = hasMobile;
+		}
+
+		public String getAlias() {
+			return alias;
+		}
+
+		public void setAlias(String alias) {
+			this.alias = alias;
+		}
+
+		public String getName() {
+			return name;
+		}
+
+		public void setName(String name) {
+			this.name = name;
+		}
+
+		public String getId() {
+			return id;
+		}
+
+		public void setId(String id) {
+			this.id = id;
+		}
+
+		public String getData() {
+			return data;
+		}
+
+		public void setData(String data) {
+			this.data = data;
+		}
+	}
+
+	public static class RelatedWidget extends GsonPropertyObject {
+
+		private static final long serialVersionUID = -6649777538891528958L;
+
+		public RelatedWidget() {
+
+		}
+
+		public RelatedWidget(Widget widget, String data) {
+			this.id = widget.getId();
+			this.alias = widget.getAlias();
+			this.name = widget.getName();
+			this.portal = widget.getPortal();
+			this.hasMobile = widget.getHasMobile();
+			this.data = data;
+		}
+
+		private String id;
+		private String alias;
+		private String name;
+		private String portal;
+		private Boolean hasMobile;
+		private String data;
+
+		public String getPortal() {
+			return portal;
+		}
+
+		public void setPortal(String portal) {
+			this.portal = portal;
+		}
+
+		public Boolean getHasMobile() {
+			return hasMobile;
+		}
+
+		public void setHasMobile(Boolean hasMobile) {
+			this.hasMobile = hasMobile;
+		}
+
+		public String getAlias() {
+			return alias;
+		}
+
+		public void setAlias(String alias) {
+			this.alias = alias;
+		}
+
+		public String getName() {
+			return name;
+		}
+
+		public void setName(String name) {
+			this.name = name;
+		}
+
+		public String getId() {
+			return id;
+		}
+
+		public void setId(String id) {
+			this.id = id;
+		}
+
+		public String getData() {
+			return data;
+		}
+
+		public void setData(String data) {
+			this.data = data;
+		}
+	}
+
+	public static class RelatedScript extends GsonPropertyObject {
+
+		private static final long serialVersionUID = -4465416667636529080L;
+
+		public static final String TYPE_PROCESSPLATFORM = "processPlatform";
+		public static final String TYPE_CMS = "cms";
+		public static final String TYPE_PORTAL = "portal";
+
+		public RelatedScript() {
+
+		}
+
+		public RelatedScript(String id, String name, String alias, String text, String type) {
+			this.id = id;
+			this.alias = alias;
+			this.name = name;
+			this.text = text;
+			this.type = type;
+		}
+
+		private String type;
+
+		private String id;
+
+		private String alias;
+
+		private String name;
+
+		private String text;
+
+		public String getId() {
+			return id;
+		}
+
+		public void setId(String id) {
+			this.id = id;
+		}
+
+		public String getAlias() {
+			return alias;
+		}
+
+		public void setAlias(String alias) {
+			this.alias = alias;
+		}
+
+		public String getName() {
+			return name;
+		}
+
+		public void setName(String name) {
+			this.name = name;
+		}
+
+		public String getType() {
+			return type;
+		}
+
+		public void setType(String type) {
+			this.type = type;
+		}
+
+		public String getText() {
+			return text;
+		}
+
+		public void setText(String text) {
+			this.text = text;
+		}
+
+	}
+
 }

+ 36 - 0
o2server/x_portal_assemble_surface/src/main/java/com/x/portal/assemble/surface/jaxrs/page/PageAction.java

@@ -121,4 +121,40 @@ public class PageAction extends StandardJaxrsAction {
 		}
 		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
 	}
+
+	@JaxrsMethodDescribe(value = "获取Page.", action = V2Get.class)
+	@GET
+	@Path("v2/{id}")
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void V2Get(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
+					  @JaxrsParameterDescribe("标识") @PathParam("id") String id) {
+		ActionResult<V2Get.Wo> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		try {
+			result = new V2Get().execute(effectivePerson, id);
+		} catch (Exception e) {
+			logger.error(e, effectivePerson, request, null);
+			result.error(e);
+		}
+		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
+	}
+
+	@JaxrsMethodDescribe(value = "获取PageMobile.", action = V2GetMobile.class)
+	@GET
+	@Path("v2/{id}/mobile")
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void V2GetMobile(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
+							@JaxrsParameterDescribe("标识") @PathParam("id") String id) {
+		ActionResult<V2GetMobile.Wo> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		try {
+			result = new V2GetMobile().execute(effectivePerson, id);
+		} catch (Exception e) {
+			logger.error(e, effectivePerson, request, null);
+			result.error(e);
+		}
+		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
+	}
 }

+ 123 - 0
o2server/x_portal_assemble_surface/src/main/java/com/x/portal/assemble/surface/jaxrs/page/V2Get.java

@@ -0,0 +1,123 @@
+package com.x.portal.assemble.surface.jaxrs.page;
+
+import com.x.base.core.container.EntityManagerContainer;
+import com.x.base.core.container.factory.EntityManagerContainerFactory;
+import com.x.base.core.project.cache.Cache.CacheKey;
+import com.x.base.core.project.cache.CacheManager;
+import com.x.base.core.project.exception.ExceptionEntityNotExist;
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.logger.Logger;
+import com.x.base.core.project.logger.LoggerFactory;
+import com.x.base.core.project.tools.ListTools;
+import com.x.portal.assemble.surface.Business;
+import com.x.portal.core.entity.Page;
+import com.x.portal.core.entity.PageProperties;
+import com.x.portal.core.entity.Script;
+import com.x.portal.core.entity.Widget;
+
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Optional;
+import java.util.TreeMap;
+import java.util.concurrent.CompletableFuture;
+
+class V2Get extends BaseAction {
+
+	private static Logger logger = LoggerFactory.getLogger(V2Get.class);
+
+	ActionResult<Wo> execute(EffectivePerson effectivePerson, String id) throws Exception {
+		ActionResult<Wo> result = new ActionResult<>();
+		CacheKey cacheKey = new CacheKey(this.getClass(), id);
+		Optional<?> optional = CacheManager.get(cacheCategory, cacheKey);
+		if (optional.isPresent()) {
+			result.setData((Wo) optional.get());
+		} else {
+			Wo wo = this.get(id);
+			CacheManager.put(cacheCategory, cacheKey, wo);
+			result.setData(wo);
+		}
+		return result;
+	}
+
+	private Wo get(String id) throws Exception {
+		Page page;
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			Business business = new Business(emc);
+			page = business.page().pick(id);
+		}
+		if (null == page) {
+			throw new ExceptionEntityNotExist(id, Page.class);
+		}
+		Wo wo = new Wo();
+		final PageProperties properties = page.getProperties();
+		wo.setFastETag(page.getId() + page.getUpdateTime().getTime());
+		wo.setPage(new RelatedPage(page, page.getDataOrMobileData()));
+		CompletableFuture<Map<String, RelatedWidget>> _relatedWidget = CompletableFuture.supplyAsync(() -> {
+			Map<String, RelatedWidget> map = new TreeMap<>();
+			if (ListTools.isNotEmpty(properties.getRelatedWidgetList())) {
+				try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+					Business bus = new Business(emc);
+					Widget _f;
+					for (String _id : properties.getRelatedWidgetList()) {
+						_f = bus.widget().pick(_id);
+						if (null != _f) {
+							map.put(_id, new RelatedWidget(_f, _f.getDataOrMobileData()));
+						}
+					}
+				} catch (Exception e) {
+					logger.error(e);
+				}
+			}
+			return map;
+		});
+		CompletableFuture<Map<String, RelatedScript>> _relatedScript = CompletableFuture.supplyAsync(() -> {
+			Map<String, RelatedScript> map = new TreeMap<>();
+			if ((null != properties.getRelatedScriptMap())
+					&& (properties.getRelatedScriptMap().size() > 0)) {
+				try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+					Business bus = new Business(emc);
+					for (Entry<String, String> entry : properties.getRelatedScriptMap().entrySet()) {
+						switch (entry.getValue()) {
+							case RelatedScript.TYPE_PROCESSPLATFORM:
+								com.x.processplatform.core.entity.element.Script _pp = bus.process().script().pick(entry.getKey());
+								if (null != _pp) {
+									map.put(entry.getKey(), new RelatedScript(_pp.getId(), _pp.getName(), _pp.getAlias(),
+											_pp.getText(), entry.getValue()));
+								}
+								break;
+							case RelatedScript.TYPE_CMS:
+								com.x.cms.core.entity.element.Script _cms = bus.cms().script().pick(entry.getKey());
+								if (null != _cms) {
+									map.put(entry.getKey(), new RelatedScript(_cms.getId(), _cms.getName(), _cms.getAlias(),
+											_cms.getText(), entry.getValue()));
+								}
+								break;
+							case RelatedScript.TYPE_PORTAL:
+								Script _p = bus.script().pick(entry.getKey());
+								if (null != _p) {
+									map.put(entry.getKey(), new RelatedScript(_p.getId(), _p.getName(), _p.getAlias(),
+											_p.getText(), entry.getValue()));
+								}
+								break;
+							default:
+								break;
+						}
+					}
+				} catch (Exception e) {
+					logger.error(e);
+				}
+			}
+			return map;
+		});
+		wo.setRelatedWidgetMap(_relatedWidget.get());
+		wo.setRelatedScriptMap(_relatedScript.get());
+		wo.setMaxAge(3600 * 24);
+		return wo;
+	}
+
+	public static class Wo extends AbstractWo {
+
+	}
+
+}

+ 123 - 0
o2server/x_portal_assemble_surface/src/main/java/com/x/portal/assemble/surface/jaxrs/page/V2GetMobile.java

@@ -0,0 +1,123 @@
+package com.x.portal.assemble.surface.jaxrs.page;
+
+import com.x.base.core.container.EntityManagerContainer;
+import com.x.base.core.container.factory.EntityManagerContainerFactory;
+import com.x.base.core.project.cache.Cache.CacheKey;
+import com.x.base.core.project.cache.CacheManager;
+import com.x.base.core.project.exception.ExceptionEntityNotExist;
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.logger.Logger;
+import com.x.base.core.project.logger.LoggerFactory;
+import com.x.base.core.project.tools.ListTools;
+import com.x.portal.assemble.surface.Business;
+import com.x.portal.core.entity.Page;
+import com.x.portal.core.entity.PageProperties;
+import com.x.portal.core.entity.Script;
+import com.x.portal.core.entity.Widget;
+
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Optional;
+import java.util.TreeMap;
+import java.util.concurrent.CompletableFuture;
+
+class V2GetMobile extends BaseAction {
+
+	private static Logger logger = LoggerFactory.getLogger(V2GetMobile.class);
+
+	ActionResult<Wo> execute(EffectivePerson effectivePerson, String id) throws Exception {
+		ActionResult<Wo> result = new ActionResult<>();
+		CacheKey cacheKey = new CacheKey(this.getClass(), id);
+		Optional<?> optional = CacheManager.get(cacheCategory, cacheKey);
+		if (optional.isPresent()) {
+			result.setData((Wo) optional.get());
+		} else {
+			Wo wo = this.get(id);
+			CacheManager.put(cacheCategory, cacheKey, wo);
+			result.setData(wo);
+		}
+		return result;
+	}
+
+	private Wo get(String id) throws Exception {
+		Page page;
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			Business business = new Business(emc);
+			page = business.page().pick(id);
+		}
+		if (null == page) {
+			throw new ExceptionEntityNotExist(id, Page.class);
+		}
+		Wo wo = new Wo();
+		final PageProperties properties = page.getProperties();
+		wo.setFastETag(page.getId() + page.getUpdateTime().getTime());
+		wo.setPage(new RelatedPage(page, page.getMobileDataOrData()));
+		CompletableFuture<Map<String, RelatedWidget>> _relatedWidget = CompletableFuture.supplyAsync(() -> {
+			Map<String, RelatedWidget> map = new TreeMap<>();
+			if (ListTools.isNotEmpty(properties.getMobileRelatedWidgetList())) {
+				try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+					Business bus = new Business(emc);
+					Widget _f;
+					for (String _id : properties.getMobileRelatedWidgetList()) {
+						_f = bus.widget().pick(_id);
+						if (null != _f) {
+							map.put(_id, new RelatedWidget(_f, _f.getMobileDataOrData()));
+						}
+					}
+				} catch (Exception e) {
+					logger.error(e);
+				}
+			}
+			return map;
+		});
+		CompletableFuture<Map<String, RelatedScript>> _relatedScript = CompletableFuture.supplyAsync(() -> {
+			Map<String, RelatedScript> map = new TreeMap<>();
+			if ((null != properties.getMobileRelatedScriptMap())
+					&& (properties.getMobileRelatedScriptMap().size() > 0)) {
+				try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+					Business bus = new Business(emc);
+					for (Entry<String, String> entry : properties.getMobileRelatedScriptMap().entrySet()) {
+						switch (entry.getValue()) {
+						case RelatedScript.TYPE_PROCESSPLATFORM:
+							com.x.processplatform.core.entity.element.Script _pp = bus.process().script().pick(entry.getKey());
+							if (null != _pp) {
+								map.put(entry.getKey(), new RelatedScript(_pp.getId(), _pp.getName(), _pp.getAlias(),
+										_pp.getText(), entry.getValue()));
+							}
+							break;
+						case RelatedScript.TYPE_CMS:
+							com.x.cms.core.entity.element.Script _cms = bus.cms().script().pick(entry.getKey());
+							if (null != _cms) {
+								map.put(entry.getKey(), new RelatedScript(_cms.getId(), _cms.getName(), _cms.getAlias(),
+										_cms.getText(), entry.getValue()));
+							}
+							break;
+						case RelatedScript.TYPE_PORTAL:
+							Script _p = bus.script().pick(entry.getKey());
+							if (null != _p) {
+								map.put(entry.getKey(), new RelatedScript(_p.getId(), _p.getName(), _p.getAlias(),
+										_p.getText(), entry.getValue()));
+							}
+							break;
+						default:
+							break;
+						}
+					}
+				} catch (Exception e) {
+					logger.error(e);
+				}
+			}
+			return map;
+		});
+		wo.setRelatedWidgetMap(_relatedWidget.get());
+		wo.setRelatedScriptMap(_relatedScript.get());
+		wo.setMaxAge(3600 * 24);
+		return wo;
+	}
+
+	public static class Wo extends AbstractWo {
+
+	}
+
+}

+ 26 - 0
o2server/x_portal_core_entity/src/main/java/com/x/portal/core/entity/Page.java

@@ -14,6 +14,7 @@ import javax.persistence.Table;
 import javax.persistence.UniqueConstraint;
 
 import org.apache.commons.lang3.StringUtils;
+import org.apache.openjpa.persistence.Persistent;
 import org.apache.openjpa.persistence.jdbc.Index;
 
 import com.x.base.core.entity.JpaObject;
@@ -26,6 +27,7 @@ import com.x.base.core.entity.annotation.Equal;
 import com.x.base.core.entity.annotation.IdReference;
 import com.x.base.core.entity.annotation.RestrictFlag;
 import com.x.base.core.project.annotation.FieldDescribe;
+import org.apache.openjpa.persistence.jdbc.Strategy;
 
 @Entity
 @ContainerEntity(dumpSize = 1000, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
@@ -58,6 +60,21 @@ public class Page extends SliceJpaObject {
 	public void onPersist() throws Exception {
 	}
 
+	public Page() {
+		this.properties = new PageProperties();
+	}
+
+	public PageProperties getProperties() {
+		if (null == this.properties) {
+			this.properties = new PageProperties();
+		}
+		return this.properties;
+	}
+
+	public void setProperties(PageProperties properties) {
+		this.properties = properties;
+	}
+
 	/* flag标志位 */
 	/* Entity 默认字段结束 */
 
@@ -136,6 +153,15 @@ public class Page extends SliceJpaObject {
 	@Column(name = ColumnNamePrefix + hasMobile_FIELDNAME)
 	private Boolean hasMobile;
 
+	public static final String properties_FIELDNAME = "properties";
+	// @Basic(fetch = FetchType.EAGER)
+	@FieldDescribe("属性对象存储字段.")
+	@Persistent(fetch = FetchType.EAGER)
+	@Strategy(JsonPropertiesValueHandler)
+	@Column(length = JpaObject.length_10M, name = ColumnNamePrefix + properties_FIELDNAME)
+	@CheckPersist(allowEmpty = true)
+	private PageProperties properties;
+
 	// public static String[] FLA GS = new String[] { JpaObject.id_FIELDNAME };
 	//
 	// public static String[] RESTRICTFLA GS = new String[] { name_FIELDNAME,

+ 57 - 0
o2server/x_portal_core_entity/src/main/java/com/x/portal/core/entity/PageProperties.java

@@ -0,0 +1,57 @@
+package com.x.portal.core.entity;
+
+import com.x.base.core.entity.JsonProperties;
+import com.x.base.core.project.annotation.FieldDescribe;
+
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+public class PageProperties extends JsonProperties {
+
+	@FieldDescribe("关联Widget.")
+	private List<String> relatedWidgetList = new ArrayList<>();
+
+	@FieldDescribe("移动端关联Widget.")
+	private List<String> mobileRelatedWidgetList = new ArrayList<>();
+
+	@FieldDescribe("关联脚本.")
+	private Map<String, String> relatedScriptMap = new LinkedHashMap<>();
+
+	@FieldDescribe("移动端关联脚本.")
+	private Map<String, String> mobileRelatedScriptMap = new LinkedHashMap<>();
+
+	public List<String> getRelatedWidgetList() {
+		return this.relatedWidgetList == null ? new ArrayList<>() : this.relatedWidgetList;
+	}
+
+	public List<String> getMobileRelatedWidgetList() {
+		return this.mobileRelatedWidgetList == null ? new ArrayList<>() : this.mobileRelatedWidgetList;
+	}
+
+	public Map<String, String> getRelatedScriptMap() {
+		return this.relatedScriptMap == null ? new LinkedHashMap<>() : this.relatedScriptMap;
+	}
+
+	public Map<String, String> getMobileRelatedScriptMap() {
+		return this.mobileRelatedScriptMap == null ? new LinkedHashMap<>() : this.mobileRelatedScriptMap;
+	}
+
+	public void setRelatedWidgetList(List<String> relatedWidgetList) {
+		this.relatedWidgetList = relatedWidgetList;
+	}
+
+	public void setMobileRelatedWidgetList(List<String> mobileRelatedWidgetList) {
+		this.mobileRelatedWidgetList = mobileRelatedWidgetList;
+	}
+
+	public void setRelatedScriptMap(Map<String, String> relatedScriptMap) {
+		this.relatedScriptMap = relatedScriptMap;
+	}
+
+	public void setMobileRelatedScriptMap(Map<String, String> mobileRelatedScriptMap) {
+		this.mobileRelatedScriptMap = mobileRelatedScriptMap;
+	}
+
+}