diff --git a/README.md b/README.md
index b1c21bf..0af1778 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,5 @@
# demo-web-resource
-10.0中标准的前端开发入口的插件接口demo。
-1、包含所有可扩展组件的demo;
-2、包含所有文件类型、解析类型的demo;
\ No newline at end of file
+10.0中标准的前端开发入口的插件接口demo。
+####1、包含所有可扩展组件的demo;
+####2、包含所有文件类型、解析类型的demo;
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
new file mode 100644
index 0000000..3d3e2c4
--- /dev/null
+++ b/build.gradle
@@ -0,0 +1,124 @@
+
+apply plugin: 'java'
+
+[compileJava,compileTestJava]*.options*.encoding = 'UTF-8'
+
+ext {
+ /**
+ * 项目中依赖的jar的路径
+ * 1.如果依赖的jar需要打包到zip中,放置在lib根目录下
+ * 2.如果依赖的jar仅仅是编译时需要,防止在lib下子目录下即可
+ */
+ libPath = "$projectDir/../webroot/WEB-INF/lib"
+
+ /**
+ * 是否对插件的class进行加密保护,防止反编译
+ */
+ guard = false
+
+ def pluginInfo = getPluginInfo()
+ pluginPre = "fine-plugin"
+ pluginName = pluginInfo.id
+ pluginVersion = pluginInfo.version
+
+ outputPath = "$projectDir/../webroot/WEB-INF/plugins/plugin-" + pluginName + "-1.0/classes"
+}
+
+group = 'com.fr.plugin'
+version = '10.0'
+sourceCompatibility = '8'
+
+sourceSets {
+ main {
+ java.outputDir = file(outputPath)
+ output.resourcesDir = file(outputPath)
+ }
+}
+
+ant.importBuild("encrypt.xml")
+//定义ant变量
+ant.projectDir = projectDir
+ant.references["compile.classpath"] = ant.path {
+ fileset(dir: libPath, includes: '**/*.jar')
+ fileset(dir: ".",includes:"**/*.jar" )
+}
+
+classes.dependsOn('clean')
+
+task copyFiles(type: Copy,dependsOn: 'classes'){
+ from outputPath
+ into "$projectDir/classes"
+}
+
+task preJar(type:Copy,dependsOn: guard ? 'compile_encrypt_javas' : 'compile_plain_javas'){
+ from "$projectDir/classes"
+ into "$projectDir/transform-classes"
+ include "**/*.*"
+}
+jar.dependsOn("preJar")
+
+task makeJar(type: Jar,dependsOn: preJar){
+ from fileTree(dir: "$projectDir/transform-classes")
+ baseName pluginPre
+ appendix pluginName
+ version pluginVersion
+ destinationDir = file("$buildDir/libs")
+
+ doLast(){
+ delete file("$projectDir/classes")
+ delete file("$projectDir/transform-classes")
+ }
+}
+
+task copyFile(type: Copy,dependsOn: ["makeJar"]){
+ from "$buildDir/libs"
+ from("$projectDir/lib") {
+ include "*.jar"
+ }
+ from "$projectDir/plugin.xml"
+ into file("$buildDir/temp/plugin")
+}
+
+task zip(type:Zip,dependsOn:["copyFile"]){
+ from "$buildDir/temp/plugin"
+ destinationDir file("$buildDir/install")
+ baseName pluginPre
+ appendix pluginName
+ version pluginVersion
+}
+
+//控制build时包含哪些文件,排除哪些文件
+processResources {
+// exclude everything
+// 用*.css没效果
+// exclude '**/*.css'
+// except this file
+// include 'xx.xml'
+}
+
+/*读取plugin.xml中的version*/
+def getPluginInfo(){
+ def xmlFile = file("plugin.xml")
+ if (!xmlFile.exists()) {
+ return ["id":"none", "version":"1.0.0"]
+ }
+ def plugin = new XmlParser().parse(xmlFile)
+ def version = plugin.version[0].text()
+ def id = plugin.id[0].text()
+ return ["id":id,"version":version]
+}
+
+repositories {
+ mavenLocal()
+ maven {
+ url = uri('http://mvn.finedevelop.com/repository/maven-public/')
+ }
+}
+
+dependencies {
+ //使用本地jar
+ implementation fileTree(dir: 'lib', include: ['**/*.jar'])
+ implementation fileTree(dir: libPath, include: ['**/*.jar'])
+}
+
+
diff --git a/encrypt.xml b/encrypt.xml
new file mode 100644
index 0000000..1401cd1
--- /dev/null
+++ b/encrypt.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/plugin.xml b/plugin.xml
new file mode 100644
index 0000000..ed9504d
--- /dev/null
+++ b/plugin.xml
@@ -0,0 +1,32 @@
+
+ com.tptj.demo.hg.web.resource.v10
+
+ yes
+ 1.0
+ 10.0
+ tptj
+ 2019-07-18
+
+
+ com.tptj.demo.hg.web.resource
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/java/com/tptj/demo/hg/web/resource/CommonDemo.java b/src/main/java/com/tptj/demo/hg/web/resource/CommonDemo.java
new file mode 100644
index 0000000..a843f34
--- /dev/null
+++ b/src/main/java/com/tptj/demo/hg/web/resource/CommonDemo.java
@@ -0,0 +1,31 @@
+package com.tptj.demo.hg.web.resource;
+
+import com.fr.decision.web.CommonComponent;
+import com.fr.web.struct.Atom;
+
+/**
+ * @author 秃破天际
+ * @version 10.0
+ * Created by 秃破天际 on 2021-03-09
+ * 1.登录页访问时,在login.js加载之前会加载(即在 Material.KEY 之后 )
+ * 2.进入平台主页面时加载,在平台自身主体JS加载之前(即在 Material.KEY 之后 )
+ * 3.进入平台地图配置时加载,在地图编辑自身主体JS加载之前(即在 Material.KEY 之后 )
+ * 4.http://localhost:8075/webroot/decision/directory
+ * 5.http://localhost:8075/webroot/decision/user
+ * 6.http://localhost:8075/webroot/decision/privilege
+ * 7.http://localhost:8075/webroot/decision/timer
+ * 8.http://localhost:8075/webroot/decision/workflow/authority
+ * 9.http://localhost:8075/webroot/decision/v10/migration/page
+ **/
+public class CommonDemo extends Demo {
+
+ @Override
+ public Atom attach() {
+ return CommonComponent.KEY;
+ }
+
+ @Override
+ public Atom[] clients() {
+ return demo("common");
+ }
+}
diff --git a/src/main/java/com/tptj/demo/hg/web/resource/ConnectionDemo.java b/src/main/java/com/tptj/demo/hg/web/resource/ConnectionDemo.java
new file mode 100644
index 0000000..36b9ed7
--- /dev/null
+++ b/src/main/java/com/tptj/demo/hg/web/resource/ConnectionDemo.java
@@ -0,0 +1,24 @@
+package com.tptj.demo.hg.web.resource;
+
+import com.fr.decision.web.ConnectionComponent;
+import com.fr.web.struct.Atom;
+
+/**
+ * @author 秃破天际
+ * @version 10.0
+ * Created by 秃破天际 on 2021-03-09
+ * 数据源连接web组件扩展
+ * 1.进入平台主页面时加载,在平台自身主体JS加载之后(即在 CommonComponent.KEY 之后 )
+ **/
+public class ConnectionDemo extends Demo {
+
+ @Override
+ public Atom attach() {
+ return ConnectionComponent.KEY;
+ }
+
+ @Override
+ public Atom[] clients() {
+ return demo("connection");
+ }
+}
diff --git a/src/main/java/com/tptj/demo/hg/web/resource/DataSetDemo.java b/src/main/java/com/tptj/demo/hg/web/resource/DataSetDemo.java
new file mode 100644
index 0000000..963fa3e
--- /dev/null
+++ b/src/main/java/com/tptj/demo/hg/web/resource/DataSetDemo.java
@@ -0,0 +1,25 @@
+package com.tptj.demo.hg.web.resource;
+
+import com.fr.decision.web.DataSetComponent;
+import com.fr.web.struct.Atom;
+
+/**
+ * @author 秃破天际
+ * @version 10.0
+ * Created by 秃破天际 on 2021-03-09
+ * 服务器数据集web组件扩展
+ * 1.进入平台主页面时加载,在平台自身主体JS加载之后(即在 CommonComponent.KEY 之后 )
+ **/
+public class DataSetDemo extends Demo {
+
+ @Override
+ public Atom attach() {
+ return DataSetComponent.KEY;
+ }
+
+ @Override
+ public Atom[] clients() {
+ return demo("dataset");
+ }
+}
+
diff --git a/src/main/java/com/tptj/demo/hg/web/resource/DecisionDemo.java b/src/main/java/com/tptj/demo/hg/web/resource/DecisionDemo.java
new file mode 100644
index 0000000..3192f66
--- /dev/null
+++ b/src/main/java/com/tptj/demo/hg/web/resource/DecisionDemo.java
@@ -0,0 +1,24 @@
+package com.tptj.demo.hg.web.resource;
+
+import com.fr.decision.web.MainComponent;
+import com.fr.stable.ArrayUtils;
+import com.fr.web.struct.Atom;
+
+/**
+ * @author 秃破天际
+ * @version 10.0
+ * Created by 秃破天际 on 2021-03-09
+ * 1.进入平台主页面时加载,在平台自身主体JS加载之后(即在 CommonComponent.KEY 之后 )
+ **/
+public class DecisionDemo extends Demo {
+
+ @Override
+ public Atom attach() {
+ return MainComponent.KEY;
+ }
+
+ @Override
+ public Atom[] clients() {
+ return ArrayUtils.addAll(demo("decision"),demoDynamic());
+ }
+}
diff --git a/src/main/java/com/tptj/demo/hg/web/resource/Demo.java b/src/main/java/com/tptj/demo/hg/web/resource/Demo.java
new file mode 100644
index 0000000..b122da5
--- /dev/null
+++ b/src/main/java/com/tptj/demo/hg/web/resource/Demo.java
@@ -0,0 +1,86 @@
+package com.tptj.demo.hg.web.resource;
+
+import com.fr.decision.fun.impl.AbstractWebResourceProvider;
+import com.fr.intelli.record.Focus;
+import com.fr.record.analyzer.EnableMetrics;
+import com.fr.web.struct.Atom;
+import com.fr.web.struct.Component;
+import com.fr.web.struct.browser.RequestClient;
+import com.fr.web.struct.category.FileType;
+import com.fr.web.struct.category.ParserType;
+import com.fr.web.struct.category.ScriptPath;
+import com.fr.web.struct.category.StylePath;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author 秃破天际
+ * @version 10.0
+ * Created by 秃破天际 on 2021-03-09
+ **/
+@EnableMetrics
+public abstract class Demo extends AbstractWebResourceProvider {
+ //Atom client() 接口已废弃,通过clients()兼容,以后的插件中全部都以clients实现
+
+ @Focus(id = "com.tptj.demo.hg.web.resource.v10",text = "WEB组件资源")
+ protected Atom[] demo(String ... names ){
+ List rt = new ArrayList(names.length);
+ for( String name : names ){
+ rt.add(new Component() {
+ @Override
+ public ScriptPath script(RequestClient client) {
+ return ScriptPath.build("com/tptj/demo/hg/web/resource/"+name+".js");
+ }
+ @Override
+ public StylePath style(RequestClient client) {
+ return StylePath.build("com/tptj/demo/hg/web/resource/demo.css");
+ }
+ });
+ }
+ return rt.toArray(new Atom[names.length]);
+ }
+
+ /**
+ * 组件中包含${}表达式的解析示例
+ * @return
+ */
+ protected Atom demoDynamic(){
+ return new Component() {
+ @Override
+ public ScriptPath script(RequestClient client) {
+ return ScriptPath.build( "com/tptj/demo/hg/web/resource/dynamic.js", ParserType.DYNAMIC );
+ }
+ @Override
+ public StylePath style(RequestClient client) {
+ return StylePath.build("com/tptj/demo/hg/web/resource/dynamic.css",ParserType.DYNAMIC);
+ }
+ };
+ }
+
+ /**
+ * 通过class把一个java类转换成js脚本的示例
+ * @return
+ */
+ protected Atom demoClass(){
+ return new Component() {
+ @Override
+ public ScriptPath script(RequestClient client) {
+ return ScriptPath.build( JsClassDemo.class.getName(), FileType.CLASS );
+ }
+ };
+ }
+
+ /**
+ * 通过class生成js脚本的简单示例
+ * @return
+ */
+ protected Atom demoSimpleClass(){
+ return new Component() {
+ @Override
+ public ScriptPath script(RequestClient client) {
+ return ScriptPath.build( JsClassSimpleDemo.class.getName(), FileType.CLASS );
+ }
+ };
+ }
+}
diff --git a/src/main/java/com/tptj/demo/hg/web/resource/DeployDemo.java b/src/main/java/com/tptj/demo/hg/web/resource/DeployDemo.java
new file mode 100644
index 0000000..f6229c0
--- /dev/null
+++ b/src/main/java/com/tptj/demo/hg/web/resource/DeployDemo.java
@@ -0,0 +1,23 @@
+package com.tptj.demo.hg.web.resource;
+
+import com.fr.decision.web.DeployComponent;
+import com.fr.web.struct.Atom;
+
+/**
+ * @author 秃破天际
+ * @version 10.0
+ * Created by 秃破天际 on 2021-03-09
+ * 服务器启动失效,部署失败时才有用的界面,没有什么插件场景会覆盖到。
+ **/
+public class DeployDemo extends Demo {
+
+ @Override
+ public Atom attach() {
+ return DeployComponent.KEY;
+ }
+
+ @Override
+ public Atom[] clients() {
+ return demo("deploy");
+ }
+}
diff --git a/src/main/java/com/tptj/demo/hg/web/resource/DirectoryDemo.java b/src/main/java/com/tptj/demo/hg/web/resource/DirectoryDemo.java
new file mode 100644
index 0000000..1391419
--- /dev/null
+++ b/src/main/java/com/tptj/demo/hg/web/resource/DirectoryDemo.java
@@ -0,0 +1,24 @@
+package com.tptj.demo.hg.web.resource;
+
+import com.fr.decision.web.DirectoryComponent;
+import com.fr.web.struct.Atom;
+
+/**
+ * @author 秃破天际
+ * @version 10.0
+ * Created by 秃破天际 on 2021-03-09
+ * http://localhost:8075/webroot/decision/directory
+ **/
+public class DirectoryDemo extends Demo {
+
+ @Override
+ public Atom attach() {
+ return DirectoryComponent.KEY;
+ }
+
+ @Override
+ public Atom[] clients() {
+ return demo("directory");
+ }
+}
+
diff --git a/src/main/java/com/tptj/demo/hg/web/resource/EncryptionDemo.java b/src/main/java/com/tptj/demo/hg/web/resource/EncryptionDemo.java
new file mode 100644
index 0000000..91b318e
--- /dev/null
+++ b/src/main/java/com/tptj/demo/hg/web/resource/EncryptionDemo.java
@@ -0,0 +1,24 @@
+package com.tptj.demo.hg.web.resource;
+
+import com.fr.decision.web.EncryptionComponent;
+import com.fr.web.struct.Atom;
+
+/**
+ * @author 秃破天际
+ * @version 10.0
+ * Created by 秃破天际 on 2021-03-09
+ * 平台切换国密的时候才可能会用到,主要用于提示异常。绝大部分情况下应该是没啥用处的。
+ * 1.http://localhost:8075/webroot/decision/v10/encryption/page
+ **/
+public class EncryptionDemo extends Demo {
+
+ @Override
+ public Atom attach() {
+ return EncryptionComponent.KEY;
+ }
+
+ @Override
+ public Atom[] clients() {
+ return demo("encryption");
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/tptj/demo/hg/web/resource/FormDemo.java b/src/main/java/com/tptj/demo/hg/web/resource/FormDemo.java
new file mode 100644
index 0000000..5e66ee1
--- /dev/null
+++ b/src/main/java/com/tptj/demo/hg/web/resource/FormDemo.java
@@ -0,0 +1,23 @@
+package com.tptj.demo.hg.web.resource;
+
+import com.fr.form.web.FormMainComponent;
+import com.fr.stable.ArrayUtils;
+import com.fr.web.struct.Atom;
+
+/**
+ * @author 秃破天际
+ * @version 10.0
+ * Created by 秃破天际 on 2021-03-09
+ * 决策报表访问时生效
+ **/
+public class FormDemo extends Demo {
+ @Override
+ public Atom attach() {
+ return FormMainComponent.KEY;
+ }
+
+ @Override
+ public Atom[] clients() {
+ return ArrayUtils.addAll(demo("form"),demoDynamic());
+ }
+}
diff --git a/src/main/java/com/tptj/demo/hg/web/resource/InitializationDemo.java b/src/main/java/com/tptj/demo/hg/web/resource/InitializationDemo.java
new file mode 100644
index 0000000..c42023a
--- /dev/null
+++ b/src/main/java/com/tptj/demo/hg/web/resource/InitializationDemo.java
@@ -0,0 +1,24 @@
+package com.tptj.demo.hg.web.resource;
+
+import com.fr.decision.web.InitializationComponent;
+import com.fr.web.struct.Atom;
+
+/**
+ * @author 秃破天际
+ * @version 10.0
+ * Created by 秃破天际 on 2021-03-09
+ * 如果系统没有初始化的情况下,才会执行。
+ * http://localhost:8075/webroot/decision/login/initialization
+ **/
+public class InitializationDemo extends Demo {
+
+ @Override
+ public Atom attach() {
+ return InitializationComponent.KEY;
+ }
+
+ @Override
+ public Atom[] clients() {
+ return demo("initialization");
+ }
+}
diff --git a/src/main/java/com/tptj/demo/hg/web/resource/JsClassDemo.java b/src/main/java/com/tptj/demo/hg/web/resource/JsClassDemo.java
new file mode 100644
index 0000000..9e669e2
--- /dev/null
+++ b/src/main/java/com/tptj/demo/hg/web/resource/JsClassDemo.java
@@ -0,0 +1,28 @@
+package com.tptj.demo.hg.web.resource;
+
+import com.fr.decision.web.util.JavaScriptWriter;
+import com.fr.gen.TextGenerator;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * @author 秃破天际
+ * @version 10.0
+ * Created by 秃破天际 on 2021-03-10
+ **/
+public class JsClassDemo implements TextGenerator {
+ @Override
+ public String text(HttpServletRequest request, HttpServletResponse response) throws Exception {
+ //可以将一个class里面的静态变量转换成JS配置的代码
+ StringBuilder sb = JavaScriptWriter.write(new Class[]{JsConfigClass.class},
+ "DemoCfg",
+ "Demo=window.Demo||{};Demo.Config=DemoCfg={};");
+ return sb.toString();
+ }
+
+ @Override
+ public String mimeType() {
+ return "text/javascript";
+ }
+}
diff --git a/src/main/java/com/tptj/demo/hg/web/resource/JsClassSimpleDemo.java b/src/main/java/com/tptj/demo/hg/web/resource/JsClassSimpleDemo.java
new file mode 100644
index 0000000..37eae68
--- /dev/null
+++ b/src/main/java/com/tptj/demo/hg/web/resource/JsClassSimpleDemo.java
@@ -0,0 +1,25 @@
+package com.tptj.demo.hg.web.resource;
+
+import com.fr.gen.TextGenerator;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * @author 秃破天际
+ * @version 10.0
+ * Created by 秃破天际 on 2021-03-10
+ **/
+public class JsClassSimpleDemo implements TextGenerator {
+ @Override
+ public String text(HttpServletRequest request, HttpServletResponse response) throws Exception {
+ return "!(function () {\n" +
+ " console.info(\"JsClassSimpleDemo JS Running!\");\n" +
+ "})();";
+ }
+
+ @Override
+ public String mimeType() {
+ return "text/javascript";
+ }
+}
diff --git a/src/main/java/com/tptj/demo/hg/web/resource/JsConfigClass.java b/src/main/java/com/tptj/demo/hg/web/resource/JsConfigClass.java
new file mode 100644
index 0000000..3f1147f
--- /dev/null
+++ b/src/main/java/com/tptj/demo/hg/web/resource/JsConfigClass.java
@@ -0,0 +1,21 @@
+package com.tptj.demo.hg.web.resource;
+
+import java.util.Date;
+
+/**
+ * @author 秃破天际
+ * @version 10.0
+ * Created by 秃破天际 on 2021-03-10
+ **/
+public class JsConfigClass {
+ public static String key1 = "asd";
+ public static boolean key2 = false;
+ public static int key3 = 100;
+ public static class key4{
+ public static String key1 = "asd";
+ public static boolean key2 = false;
+ public static int key3 = 100;
+ //日期类的需要转换成文本或者数字存储!
+ public static long date = System.currentTimeMillis();
+ }
+}
diff --git a/src/main/java/com/tptj/demo/hg/web/resource/LoginDemo.java b/src/main/java/com/tptj/demo/hg/web/resource/LoginDemo.java
new file mode 100644
index 0000000..8dbe689
--- /dev/null
+++ b/src/main/java/com/tptj/demo/hg/web/resource/LoginDemo.java
@@ -0,0 +1,24 @@
+package com.tptj.demo.hg.web.resource;
+
+import com.fr.decision.web.LoginComponent;
+import com.fr.stable.ArrayUtils;
+import com.fr.web.struct.Atom;
+
+/**
+ * @author 秃破天际
+ * @version 10.0
+ * Created by 秃破天际 on 2021-03-09
+ * 1.登录页访问时,在login.js加载之后会加载(即在 CommonComponent.KEY 之后 )
+ **/
+public class LoginDemo extends Demo {
+
+ @Override
+ public Atom attach() {
+ return LoginComponent.KEY;
+ }
+
+ @Override
+ public Atom[] clients() {
+ return ArrayUtils.addAll(demo("login"),demoDynamic(),demoClass(),demoSimpleClass());
+ }
+}
diff --git a/src/main/java/com/tptj/demo/hg/web/resource/MapEditDemo.java b/src/main/java/com/tptj/demo/hg/web/resource/MapEditDemo.java
new file mode 100644
index 0000000..7807ed5
--- /dev/null
+++ b/src/main/java/com/tptj/demo/hg/web/resource/MapEditDemo.java
@@ -0,0 +1,24 @@
+package com.tptj.demo.hg.web.resource;
+
+import com.fr.decision.web.MapEditComponent;
+import com.fr.web.struct.Atom;
+
+/**
+ * @author 秃破天际
+ * @version 10.0
+ * Created by 秃破天际 on 2021-03-09
+ * 地图编辑web组件扩展
+ * 1.地图编辑打开时,在CommonComponent.KEY 之后执行MapEditComponent.KEY 再执行MapEditDemo
+ **/
+public class MapEditDemo extends Demo {
+
+ @Override
+ public Atom attach() {
+ return MapEditComponent.KEY;
+ }
+
+ @Override
+ public Atom[] clients() {
+ return demo("map.edit");
+ }
+}
diff --git a/src/main/java/com/tptj/demo/hg/web/resource/MigrationDemo.java b/src/main/java/com/tptj/demo/hg/web/resource/MigrationDemo.java
new file mode 100644
index 0000000..fd3ea87
--- /dev/null
+++ b/src/main/java/com/tptj/demo/hg/web/resource/MigrationDemo.java
@@ -0,0 +1,25 @@
+package com.tptj.demo.hg.web.resource;
+
+import com.fr.decision.web.MigrationComponent;
+import com.fr.web.struct.Atom;
+
+/**
+ * @author 秃破天际
+ * @version 10.0
+ * Created by 秃破天际 on 2021-03-09
+ * 数据库迁移组件web资源扩展
+ * http://localhost:8075/webroot/decision/v10/migration/page
+ * 迁移过程中的效果页面可以修改
+ **/
+public class MigrationDemo extends Demo {
+
+ @Override
+ public Atom attach() {
+ return MigrationComponent.KEY;
+ }
+
+ @Override
+ public Atom[] clients() {
+ return demo("migration");
+ }
+}
diff --git a/src/main/java/com/tptj/demo/hg/web/resource/PrivilegeDemo.java b/src/main/java/com/tptj/demo/hg/web/resource/PrivilegeDemo.java
new file mode 100644
index 0000000..8fdcbfc
--- /dev/null
+++ b/src/main/java/com/tptj/demo/hg/web/resource/PrivilegeDemo.java
@@ -0,0 +1,24 @@
+package com.tptj.demo.hg.web.resource;
+
+import com.fr.decision.web.PrivilegeComponent;
+import com.fr.web.struct.Atom;
+
+/**
+ * @author 秃破天际
+ * @version 10.0
+ * Created by 秃破天际 on 2021-03-09
+ * 权限管理web组件扩展
+ * 1.http://localhost:8075/webroot/decision/privilege
+ **/
+public class PrivilegeDemo extends Demo {
+
+ @Override
+ public Atom attach() {
+ return PrivilegeComponent.KEY;
+ }
+
+ @Override
+ public Atom[] clients() {
+ return demo("privilege");
+ }
+}
diff --git a/src/main/java/com/tptj/demo/hg/web/resource/ReportDemo.java b/src/main/java/com/tptj/demo/hg/web/resource/ReportDemo.java
new file mode 100644
index 0000000..eb24f53
--- /dev/null
+++ b/src/main/java/com/tptj/demo/hg/web/resource/ReportDemo.java
@@ -0,0 +1,24 @@
+package com.tptj.demo.hg.web.resource;
+
+import com.fr.report.web.ReportMainComponent;
+import com.fr.stable.ArrayUtils;
+import com.fr.web.struct.Atom;
+
+/**
+ * @author 秃破天际
+ * @version 10.0
+ * Created by 秃破天际 on 2021-03-09
+ * cpt报表访问时引入JS
+ **/
+public class ReportDemo extends Demo {
+
+ @Override
+ public Atom attach() {
+ return ReportMainComponent.KEY;
+ }
+
+ @Override
+ public Atom[] clients() {
+ return ArrayUtils.addAll(demo("report"),demoDynamic());
+ }
+}
diff --git a/src/main/java/com/tptj/demo/hg/web/resource/ScheduleDemo.java b/src/main/java/com/tptj/demo/hg/web/resource/ScheduleDemo.java
new file mode 100644
index 0000000..52a0e3a
--- /dev/null
+++ b/src/main/java/com/tptj/demo/hg/web/resource/ScheduleDemo.java
@@ -0,0 +1,24 @@
+package com.tptj.demo.hg.web.resource;
+
+import com.fr.schedule.feature.ScheduleComponent;
+import com.fr.web.struct.Atom;
+
+/**
+ * @author 秃破天际
+ * @version 10.0
+ * Created by 秃破天际 on 2021-03-09
+ * 定时调度WEB组件扩展——单独集成
+ * http://localhost:8075/webroot/decision/timer
+ **/
+public class ScheduleDemo extends Demo {
+
+ @Override
+ public Atom attach() {
+ return ScheduleComponent.KEY;
+ }
+
+ @Override
+ public Atom[] clients() {
+ return demo("schedule");
+ }
+}
diff --git a/src/main/java/com/tptj/demo/hg/web/resource/UserDemo.java b/src/main/java/com/tptj/demo/hg/web/resource/UserDemo.java
new file mode 100644
index 0000000..96b9da3
--- /dev/null
+++ b/src/main/java/com/tptj/demo/hg/web/resource/UserDemo.java
@@ -0,0 +1,23 @@
+package com.tptj.demo.hg.web.resource;
+
+import com.fr.decision.web.UserComponent;
+import com.fr.web.struct.Atom;
+
+/**
+ * @author 秃破天际
+ * @version 10.0
+ * Created by 秃破天际 on 2021-03-09
+ * 1.http://localhost:8075/webroot/decision/user
+ **/
+public class UserDemo extends Demo {
+
+ @Override
+ public Atom attach() {
+ return UserComponent.KEY;
+ }
+
+ @Override
+ public Atom[] clients() {
+ return demo("user");
+ }
+}
diff --git a/src/main/java/com/tptj/demo/hg/web/resource/WorkflowDemo.java b/src/main/java/com/tptj/demo/hg/web/resource/WorkflowDemo.java
new file mode 100644
index 0000000..befc393
--- /dev/null
+++ b/src/main/java/com/tptj/demo/hg/web/resource/WorkflowDemo.java
@@ -0,0 +1,24 @@
+package com.tptj.demo.hg.web.resource;
+
+import com.fr.decision.web.WorkflowComponent;
+import com.fr.web.struct.Atom;
+
+/**
+ * @author 秃破天际
+ * @version 10.0
+ * Created by 秃破天际 on 2021-03-09
+ * 多级上报权限控制单独集成时有效
+ * http://localhost:8075/webroot/decision/workflow/authority
+ **/
+public class WorkflowDemo extends Demo {
+
+ @Override
+ public Atom attach() {
+ return WorkflowComponent.KEY;
+ }
+
+ @Override
+ public Atom[] clients() {
+ return demo("workflow");
+ }
+}
\ No newline at end of file
diff --git a/src/main/resources/com/tptj/demo/hg/web/resource/common.js b/src/main/resources/com/tptj/demo/hg/web/resource/common.js
new file mode 100644
index 0000000..e626f7d
--- /dev/null
+++ b/src/main/resources/com/tptj/demo/hg/web/resource/common.js
@@ -0,0 +1,8 @@
+/**
+ * @author 秃破天际
+ * @version 10.0
+ * Created by 秃破天际 on 2021-03-09
+ **/
+!(function () {
+ console.info("Common JS Running!");
+})();
\ No newline at end of file
diff --git a/src/main/resources/com/tptj/demo/hg/web/resource/connection.js b/src/main/resources/com/tptj/demo/hg/web/resource/connection.js
new file mode 100644
index 0000000..9607725
--- /dev/null
+++ b/src/main/resources/com/tptj/demo/hg/web/resource/connection.js
@@ -0,0 +1,8 @@
+/**
+ * @author 秃破天际
+ * @version 10.0
+ * Created by 秃破天际 on 2021-03-09
+ **/
+!(function () {
+ console.info("Connection JS Running!");
+})();
\ No newline at end of file
diff --git a/src/main/resources/com/tptj/demo/hg/web/resource/dataset.js b/src/main/resources/com/tptj/demo/hg/web/resource/dataset.js
new file mode 100644
index 0000000..91e9ff5
--- /dev/null
+++ b/src/main/resources/com/tptj/demo/hg/web/resource/dataset.js
@@ -0,0 +1,8 @@
+/**
+ * @author 秃破天际
+ * @version 10.0
+ * Created by 秃破天际 on 2021-03-09
+ **/
+!(function () {
+ console.info("DataSet JS Is Running!");
+})();
\ No newline at end of file
diff --git a/src/main/resources/com/tptj/demo/hg/web/resource/decision.js b/src/main/resources/com/tptj/demo/hg/web/resource/decision.js
new file mode 100644
index 0000000..6a86431
--- /dev/null
+++ b/src/main/resources/com/tptj/demo/hg/web/resource/decision.js
@@ -0,0 +1,8 @@
+/**
+ * @author 秃破天际
+ * @version 10.0
+ * Created by 秃破天际 on 2021-03-09
+ **/
+!(function () {
+ console.info("Decision JS Running!");
+})();
\ No newline at end of file
diff --git a/src/main/resources/com/tptj/demo/hg/web/resource/demo.css b/src/main/resources/com/tptj/demo/hg/web/resource/demo.css
new file mode 100644
index 0000000..e69de29
diff --git a/src/main/resources/com/tptj/demo/hg/web/resource/demo.png b/src/main/resources/com/tptj/demo/hg/web/resource/demo.png
new file mode 100644
index 0000000..8986667
Binary files /dev/null and b/src/main/resources/com/tptj/demo/hg/web/resource/demo.png differ
diff --git a/src/main/resources/com/tptj/demo/hg/web/resource/deploy.js b/src/main/resources/com/tptj/demo/hg/web/resource/deploy.js
new file mode 100644
index 0000000..fdb42ed
--- /dev/null
+++ b/src/main/resources/com/tptj/demo/hg/web/resource/deploy.js
@@ -0,0 +1,8 @@
+/**
+ * @author 秃破天际
+ * @version 10.0
+ * Created by 秃破天际 on 2021-03-09
+ **/
+!(function () {
+ console.info("Deploy JS Running!");
+})();
\ No newline at end of file
diff --git a/src/main/resources/com/tptj/demo/hg/web/resource/directory.js b/src/main/resources/com/tptj/demo/hg/web/resource/directory.js
new file mode 100644
index 0000000..9eba43e
--- /dev/null
+++ b/src/main/resources/com/tptj/demo/hg/web/resource/directory.js
@@ -0,0 +1,8 @@
+/**
+ * @author 秃破天际
+ * @version 10.0
+ * Created by 秃破天际 on 2021-03-09
+ **/
+!(function () {
+ console.info("Directory JS Is Running!");
+})();
\ No newline at end of file
diff --git a/src/main/resources/com/tptj/demo/hg/web/resource/dynamic.css b/src/main/resources/com/tptj/demo/hg/web/resource/dynamic.css
new file mode 100644
index 0000000..b6a4b8f
--- /dev/null
+++ b/src/main/resources/com/tptj/demo/hg/web/resource/dynamic.css
@@ -0,0 +1,3 @@
+body{
+ background: url('${fineServletURL}/view/report?op=resource&resource=/com/tptj/demo/hg/web/resource/demo.png')
+}
\ No newline at end of file
diff --git a/src/main/resources/com/tptj/demo/hg/web/resource/dynamic.js b/src/main/resources/com/tptj/demo/hg/web/resource/dynamic.js
new file mode 100644
index 0000000..f91fd3f
--- /dev/null
+++ b/src/main/resources/com/tptj/demo/hg/web/resource/dynamic.js
@@ -0,0 +1,8 @@
+/**
+ * @author 秃破天际
+ * @version 10.0
+ * Created by 秃破天际 on 2021-03-16
+ **/
+!(function () {
+ console.info("${fineServletURL}");
+})();
\ No newline at end of file
diff --git a/src/main/resources/com/tptj/demo/hg/web/resource/encryption.js b/src/main/resources/com/tptj/demo/hg/web/resource/encryption.js
new file mode 100644
index 0000000..da11bd6
--- /dev/null
+++ b/src/main/resources/com/tptj/demo/hg/web/resource/encryption.js
@@ -0,0 +1,8 @@
+/**
+ * @author 秃破天际
+ * @version 10.0
+ * Created by 秃破天际 on 2021-03-09
+ **/
+!(function () {
+ console.info("Encryption JS Is Running!");
+})();
\ No newline at end of file
diff --git a/src/main/resources/com/tptj/demo/hg/web/resource/form.js b/src/main/resources/com/tptj/demo/hg/web/resource/form.js
new file mode 100644
index 0000000..2372c31
--- /dev/null
+++ b/src/main/resources/com/tptj/demo/hg/web/resource/form.js
@@ -0,0 +1,8 @@
+/**
+ * @author 秃破天际
+ * @version 10.0
+ * Created by 秃破天际 on 2021-03-09
+ **/
+!(function () {
+ console.info("Form JS Running!");
+})();
\ No newline at end of file
diff --git a/src/main/resources/com/tptj/demo/hg/web/resource/initialization.js b/src/main/resources/com/tptj/demo/hg/web/resource/initialization.js
new file mode 100644
index 0000000..35c1746
--- /dev/null
+++ b/src/main/resources/com/tptj/demo/hg/web/resource/initialization.js
@@ -0,0 +1,8 @@
+/**
+ * @author 秃破天际
+ * @version 10.0
+ * Created by 秃破天际 on 2021-03-09
+ **/
+!(function () {
+ console.info("Initialization JS Running!");
+})();
\ No newline at end of file
diff --git a/src/main/resources/com/tptj/demo/hg/web/resource/login.js b/src/main/resources/com/tptj/demo/hg/web/resource/login.js
new file mode 100644
index 0000000..c8211eb
--- /dev/null
+++ b/src/main/resources/com/tptj/demo/hg/web/resource/login.js
@@ -0,0 +1,8 @@
+/**
+ * @author 秃破天际
+ * @version 10.0
+ * Created by 秃破天际 on 2021-03-09
+ **/
+!(function () {
+ console.info("Login JS Running!");
+})();
\ No newline at end of file
diff --git a/src/main/resources/com/tptj/demo/hg/web/resource/map.edit.js b/src/main/resources/com/tptj/demo/hg/web/resource/map.edit.js
new file mode 100644
index 0000000..95c7439
--- /dev/null
+++ b/src/main/resources/com/tptj/demo/hg/web/resource/map.edit.js
@@ -0,0 +1,8 @@
+/**
+ * @author 秃破天际
+ * @version 10.0
+ * Created by 秃破天际 on 2021-03-09
+ **/
+!(function () {
+ console.info("Map.Edit JS Is Running!");
+})();
\ No newline at end of file
diff --git a/src/main/resources/com/tptj/demo/hg/web/resource/migration.js b/src/main/resources/com/tptj/demo/hg/web/resource/migration.js
new file mode 100644
index 0000000..7469ae4
--- /dev/null
+++ b/src/main/resources/com/tptj/demo/hg/web/resource/migration.js
@@ -0,0 +1,8 @@
+/**
+ * @author 秃破天际
+ * @version 10.0
+ * Created by 秃破天际 on 2021-03-09
+ **/
+!(function () {
+ console.info("Migration JS Running!");
+})();
\ No newline at end of file
diff --git a/src/main/resources/com/tptj/demo/hg/web/resource/privilege.js b/src/main/resources/com/tptj/demo/hg/web/resource/privilege.js
new file mode 100644
index 0000000..a6cf1ae
--- /dev/null
+++ b/src/main/resources/com/tptj/demo/hg/web/resource/privilege.js
@@ -0,0 +1,8 @@
+/**
+ * @author 秃破天际
+ * @version 10.0
+ * Created by 秃破天际 on 2021-03-09
+ **/
+!(function () {
+ console.info("Privilege JS Running!");
+})();
\ No newline at end of file
diff --git a/src/main/resources/com/tptj/demo/hg/web/resource/report.js b/src/main/resources/com/tptj/demo/hg/web/resource/report.js
new file mode 100644
index 0000000..10285c3
--- /dev/null
+++ b/src/main/resources/com/tptj/demo/hg/web/resource/report.js
@@ -0,0 +1,10 @@
+/**
+ * @author 秃破天际
+ * @version 10.0
+ * Created by 秃破天际 on 2021-03-08
+ **/
+!(function () {
+ FR.test = function(){
+ };
+ console.info("Report JS Running!");
+})();
\ No newline at end of file
diff --git a/src/main/resources/com/tptj/demo/hg/web/resource/schedule.js b/src/main/resources/com/tptj/demo/hg/web/resource/schedule.js
new file mode 100644
index 0000000..2fa5013
--- /dev/null
+++ b/src/main/resources/com/tptj/demo/hg/web/resource/schedule.js
@@ -0,0 +1,8 @@
+/**
+ * @author 秃破天际
+ * @version 10.0
+ * Created by 秃破天际 on 2021-03-09
+ **/
+!(function () {
+ console.info("Schedule JS Is Running!");
+})();
\ No newline at end of file
diff --git a/src/main/resources/com/tptj/demo/hg/web/resource/user.js b/src/main/resources/com/tptj/demo/hg/web/resource/user.js
new file mode 100644
index 0000000..e45b022
--- /dev/null
+++ b/src/main/resources/com/tptj/demo/hg/web/resource/user.js
@@ -0,0 +1,8 @@
+/**
+ * @author 秃破天际
+ * @version 10.0
+ * Created by 秃破天际 on 2021-03-09
+ **/
+!(function () {
+ console.info("User JS Is Running!");
+})();
\ No newline at end of file
diff --git a/src/main/resources/com/tptj/demo/hg/web/resource/workflow.js b/src/main/resources/com/tptj/demo/hg/web/resource/workflow.js
new file mode 100644
index 0000000..abd45f6
--- /dev/null
+++ b/src/main/resources/com/tptj/demo/hg/web/resource/workflow.js
@@ -0,0 +1,8 @@
+/**
+ * @author 秃破天际
+ * @version 10.0
+ * Created by 秃破天际 on 2021-03-09
+ **/
+!(function () {
+ console.info("Workflow JS Is Running!");
+})();
\ No newline at end of file