Browse Source

使用最新的 form generator 编辑器

YunaiV 3 years ago
parent
commit
d574a99dfc
100 changed files with 2124 additions and 2 deletions
  1. 6 2
      yudao-admin-ui/package.json
  2. BIN
      yudao-admin-ui/public/libs/monaco-editor/vs/base/browser/ui/codicons/codicon/codicon.ttf
  3. 5 0
      yudao-admin-ui/public/libs/monaco-editor/vs/base/worker/workerMain.js
  4. 6 0
      yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/abap/abap.js
  5. 6 0
      yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/apex/apex.js
  6. 7 0
      yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/azcli/azcli.js
  7. 7 0
      yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/bat/bat.js
  8. 6 0
      yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/cameligo/cameligo.js
  9. 6 0
      yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/clojure/clojure.js
  10. 6 0
      yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/coffee/coffee.js
  11. 6 0
      yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/cpp/cpp.js
  12. 6 0
      yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/csharp/csharp.js
  13. 7 0
      yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/csp/csp.js
  14. 6 0
      yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/css/css.js
  15. 6 0
      yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/dart/dart.js
  16. 7 0
      yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/dockerfile/dockerfile.js
  17. 6 0
      yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/ecl/ecl.js
  18. 6 0
      yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/fsharp/fsharp.js
  19. 6 0
      yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/go/go.js
  20. 6 0
      yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/graphql/graphql.js
  21. 6 0
      yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/handlebars/handlebars.js
  22. 6 0
      yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/hcl/hcl.js
  23. 6 0
      yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/html/html.js
  24. 7 0
      yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/ini/ini.js
  25. 6 0
      yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/java/java.js
  26. 6 0
      yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/javascript/javascript.js
  27. 6 0
      yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/julia/julia.js
  28. 6 0
      yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/kotlin/kotlin.js
  29. 6 0
      yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/less/less.js
  30. 6 0
      yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/lexon/lexon.js
  31. 6 0
      yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/lua/lua.js
  32. 6 0
      yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/m3/m3.js
  33. 6 0
      yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/markdown/markdown.js
  34. 6 0
      yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/mips/mips.js
  35. 6 0
      yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/msdax/msdax.js
  36. 6 0
      yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/mysql/mysql.js
  37. 6 0
      yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/objective-c/objective-c.js
  38. 6 0
      yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/pascal/pascal.js
  39. 6 0
      yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/pascaligo/pascaligo.js
  40. 6 0
      yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/perl/perl.js
  41. 6 0
      yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/pgsql/pgsql.js
  42. 6 0
      yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/php/php.js
  43. 6 0
      yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/postiats/postiats.js
  44. 6 0
      yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/powerquery/powerquery.js
  45. 6 0
      yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/powershell/powershell.js
  46. 6 0
      yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/pug/pug.js
  47. 6 0
      yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/python/python.js
  48. 6 0
      yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/r/r.js
  49. 6 0
      yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/razor/razor.js
  50. 6 0
      yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/redis/redis.js
  51. 6 0
      yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/redshift/redshift.js
  52. 6 0
      yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/restructuredtext/restructuredtext.js
  53. 6 0
      yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/ruby/ruby.js
  54. 6 0
      yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/rust/rust.js
  55. 7 0
      yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/sb/sb.js
  56. 6 0
      yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/scala/scala.js
  57. 7 0
      yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/scheme/scheme.js
  58. 6 0
      yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/scss/scss.js
  59. 6 0
      yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/shell/shell.js
  60. 6 0
      yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/solidity/solidity.js
  61. 6 0
      yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/sophia/sophia.js
  62. 6 0
      yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/sql/sql.js
  63. 6 0
      yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/st/st.js
  64. 9 0
      yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/swift/swift.js
  65. 6 0
      yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/systemverilog/systemverilog.js
  66. 6 0
      yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/tcl/tcl.js
  67. 6 0
      yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/twig/twig.js
  68. 6 0
      yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/typescript/typescript.js
  69. 6 0
      yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/vb/vb.js
  70. 6 0
      yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/xml/xml.js
  71. 6 0
      yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/yaml/yaml.js
  72. 5 0
      yudao-admin-ui/public/libs/monaco-editor/vs/editor/editor.main.css
  73. 5 0
      yudao-admin-ui/public/libs/monaco-editor/vs/editor/editor.main.js
  74. 5 0
      yudao-admin-ui/public/libs/monaco-editor/vs/editor/editor.main.nls.de.js
  75. 5 0
      yudao-admin-ui/public/libs/monaco-editor/vs/editor/editor.main.nls.es.js
  76. 5 0
      yudao-admin-ui/public/libs/monaco-editor/vs/editor/editor.main.nls.fr.js
  77. 5 0
      yudao-admin-ui/public/libs/monaco-editor/vs/editor/editor.main.nls.it.js
  78. 5 0
      yudao-admin-ui/public/libs/monaco-editor/vs/editor/editor.main.nls.ja.js
  79. 0 0
      yudao-admin-ui/public/libs/monaco-editor/vs/editor/editor.main.nls.js
  80. 5 0
      yudao-admin-ui/public/libs/monaco-editor/vs/editor/editor.main.nls.ko.js
  81. 5 0
      yudao-admin-ui/public/libs/monaco-editor/vs/editor/editor.main.nls.ru.js
  82. 5 0
      yudao-admin-ui/public/libs/monaco-editor/vs/editor/editor.main.nls.zh-cn.js
  83. 5 0
      yudao-admin-ui/public/libs/monaco-editor/vs/editor/editor.main.nls.zh-tw.js
  84. 6 0
      yudao-admin-ui/public/libs/monaco-editor/vs/language/css/cssMode.js
  85. 6 0
      yudao-admin-ui/public/libs/monaco-editor/vs/language/css/cssWorker.js
  86. 6 0
      yudao-admin-ui/public/libs/monaco-editor/vs/language/html/htmlMode.js
  87. 6 0
      yudao-admin-ui/public/libs/monaco-editor/vs/language/html/htmlWorker.js
  88. 6 0
      yudao-admin-ui/public/libs/monaco-editor/vs/language/json/jsonMode.js
  89. 6 0
      yudao-admin-ui/public/libs/monaco-editor/vs/language/json/jsonWorker.js
  90. 6 0
      yudao-admin-ui/public/libs/monaco-editor/vs/language/typescript/tsMode.js
  91. 20 0
      yudao-admin-ui/public/libs/monaco-editor/vs/language/typescript/tsWorker.js
  92. 5 0
      yudao-admin-ui/public/libs/monaco-editor/vs/loader.js
  93. 629 0
      yudao-admin-ui/src/components/generator/config.js
  94. 18 0
      yudao-admin-ui/src/components/generator/css.js
  95. 37 0
      yudao-admin-ui/src/components/generator/drawingDefalut.js
  96. 399 0
      yudao-admin-ui/src/components/generator/html.js
  97. 271 0
      yudao-admin-ui/src/components/generator/js.js
  98. 16 0
      yudao-admin-ui/src/components/generator/ruleTrigger.js
  99. 186 0
      yudao-admin-ui/src/components/parser/Parser.vue
  100. 17 0
      yudao-admin-ui/src/components/parser/README.md

+ 6 - 2
yudao-admin-ui/package.json

@@ -62,7 +62,9 @@
     "vuex": "3.6.0",
     "bpmn-js-token-simulation": "^0.10.0",
     "min-dash": "^3.5.2",
-    "xml-js": "^1.6.11"
+    "xml-js": "^1.6.11",
+    "@babel/parser": "^7.7.4",
+    "throttle-debounce": "^2.1.0"
   },
   "devDependencies": {
     "@vue/cli-plugin-babel": "4.4.6",
@@ -92,7 +94,9 @@
     "eslint-plugin-prettier": "^3.1.0",
     "fs-extra": "^8.1.0",
     "terser-webpack-plugin": "^4.2.3",
-    "webpack-bundle-analyzer": "^3.9.0"
+    "webpack-bundle-analyzer": "^3.9.0",
+    "eslint-config-airbnb-base": "^14.0.0",
+    "eslint-plugin-import": "^2.20.0"
   },
   "engines": {
     "node": ">=8.9",

BIN
yudao-admin-ui/public/libs/monaco-editor/vs/base/browser/ui/codicons/codicon/codicon.ttf


File diff suppressed because it is too large
+ 5 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/base/worker/workerMain.js


File diff suppressed because it is too large
+ 6 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/abap/abap.js


File diff suppressed because it is too large
+ 6 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/apex/apex.js


+ 7 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/azcli/azcli.js

@@ -0,0 +1,7 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53)
+ * Released under the MIT license
+ * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/azcli/azcli",["require","exports"],(function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.language=t.conf=void 0,t.conf={comments:{lineComment:"#"}},t.language={defaultToken:"keyword",ignoreCase:!0,tokenPostfix:".azcli",str:/[^#\s]/,tokenizer:{root:[{include:"@comment"},[/\s-+@str*\s*/,{cases:{"@eos":{token:"key.identifier",next:"@popall"},"@default":{token:"key.identifier",next:"@type"}}}],[/^-+@str*\s*/,{cases:{"@eos":{token:"key.identifier",next:"@popall"},"@default":{token:"key.identifier",next:"@type"}}}]],type:[{include:"@comment"},[/-+@str*\s*/,{cases:{"@eos":{token:"key.identifier",next:"@popall"},"@default":"key.identifier"}}],[/@str+\s*/,{cases:{"@eos":{token:"string",next:"@popall"},"@default":"string"}}]],comment:[[/#.*$/,{cases:{"@eos":{token:"comment",next:"@popall"}}}]]}}}));

+ 7 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/bat/bat.js

@@ -0,0 +1,7 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53)
+ * Released under the MIT license
+ * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/bat/bat",["require","exports"],(function(e,s){"use strict";Object.defineProperty(s,"__esModule",{value:!0}),s.language=s.conf=void 0,s.conf={comments:{lineComment:"REM"},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'}],surroundingPairs:[{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'}],folding:{markers:{start:new RegExp("^\\s*(::\\s*|REM\\s+)#region"),end:new RegExp("^\\s*(::\\s*|REM\\s+)#endregion")}}},s.language={defaultToken:"",ignoreCase:!0,tokenPostfix:".bat",brackets:[{token:"delimiter.bracket",open:"{",close:"}"},{token:"delimiter.parenthesis",open:"(",close:")"},{token:"delimiter.square",open:"[",close:"]"}],keywords:/call|defined|echo|errorlevel|exist|for|goto|if|pause|set|shift|start|title|not|pushd|popd/,symbols:/[=><!~?&|+\-*\/\^;\.,]+/,escapes:/\\(?:[abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,tokenizer:{root:[[/^(\s*)(rem(?:\s.*|))$/,["","comment"]],[/(\@?)(@keywords)(?!\w)/,[{token:"keyword"},{token:"keyword.$2"}]],[/[ \t\r\n]+/,""],[/setlocal(?!\w)/,"keyword.tag-setlocal"],[/endlocal(?!\w)/,"keyword.tag-setlocal"],[/[a-zA-Z_]\w*/,""],[/:\w*/,"metatag"],[/%[^%]+%/,"variable"],[/%%[\w]+(?!\w)/,"variable"],[/[{}()\[\]]/,"@brackets"],[/@symbols/,"delimiter"],[/\d*\.\d+([eE][\-+]?\d+)?/,"number.float"],[/0[xX][0-9a-fA-F_]*[0-9a-fA-F]/,"number.hex"],[/\d+/,"number"],[/[;,.]/,"delimiter"],[/"/,"string",'@string."'],[/'/,"string","@string.'"]],string:[[/[^\\"'%]+/,{cases:{"@eos":{token:"string",next:"@popall"},"@default":"string"}}],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/%[\w ]+%/,"variable"],[/%%[\w]+(?!\w)/,"variable"],[/["']/,{cases:{"$#==$S2":{token:"string",next:"@pop"},"@default":"string"}}],[/$/,"string","@popall"]]}}}));

File diff suppressed because it is too large
+ 6 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/cameligo/cameligo.js


File diff suppressed because it is too large
+ 6 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/clojure/clojure.js


File diff suppressed because it is too large
+ 6 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/coffee/coffee.js


File diff suppressed because it is too large
+ 6 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/cpp/cpp.js


File diff suppressed because it is too large
+ 6 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/csharp/csharp.js


+ 7 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/csp/csp.js

@@ -0,0 +1,7 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53)
+ * Released under the MIT license
+ * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/csp/csp",["require","exports"],(function(t,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.language=e.conf=void 0,e.conf={brackets:[],autoClosingPairs:[],surroundingPairs:[]},e.language={keywords:[],typeKeywords:[],tokenPostfix:".csp",operators:[],symbols:/[=><!~?:&|+\-*\/\^%]+/,escapes:/\\(?:[abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,tokenizer:{root:[[/child-src/,"string.quote"],[/connect-src/,"string.quote"],[/default-src/,"string.quote"],[/font-src/,"string.quote"],[/frame-src/,"string.quote"],[/img-src/,"string.quote"],[/manifest-src/,"string.quote"],[/media-src/,"string.quote"],[/object-src/,"string.quote"],[/script-src/,"string.quote"],[/style-src/,"string.quote"],[/worker-src/,"string.quote"],[/base-uri/,"string.quote"],[/plugin-types/,"string.quote"],[/sandbox/,"string.quote"],[/disown-opener/,"string.quote"],[/form-action/,"string.quote"],[/frame-ancestors/,"string.quote"],[/report-uri/,"string.quote"],[/report-to/,"string.quote"],[/upgrade-insecure-requests/,"string.quote"],[/block-all-mixed-content/,"string.quote"],[/require-sri-for/,"string.quote"],[/reflected-xss/,"string.quote"],[/referrer/,"string.quote"],[/policy-uri/,"string.quote"],[/'self'/,"string.quote"],[/'unsafe-inline'/,"string.quote"],[/'unsafe-eval'/,"string.quote"],[/'strict-dynamic'/,"string.quote"],[/'unsafe-hashed-attributes'/,"string.quote"]]}}}));

File diff suppressed because it is too large
+ 6 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/css/css.js


File diff suppressed because it is too large
+ 6 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/dart/dart.js


+ 7 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/dockerfile/dockerfile.js

@@ -0,0 +1,7 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53)
+ * Released under the MIT license
+ * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/dockerfile/dockerfile",["require","exports"],(function(e,o){"use strict";Object.defineProperty(o,"__esModule",{value:!0}),o.language=o.conf=void 0,o.conf={brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}]},o.language={defaultToken:"",tokenPostfix:".dockerfile",variable:/\${?[\w]+}?/,tokenizer:{root:[{include:"@whitespace"},{include:"@comment"},[/(ONBUILD)(\s+)/,["keyword",""]],[/(ENV)(\s+)([\w]+)/,["keyword","",{token:"variable",next:"@arguments"}]],[/(FROM|MAINTAINER|RUN|EXPOSE|ENV|ADD|ARG|VOLUME|LABEL|USER|WORKDIR|COPY|CMD|STOPSIGNAL|SHELL|HEALTHCHECK|ENTRYPOINT)/,{token:"keyword",next:"@arguments"}]],arguments:[{include:"@whitespace"},{include:"@strings"},[/(@variable)/,{cases:{"@eos":{token:"variable",next:"@popall"},"@default":"variable"}}],[/\\/,{cases:{"@eos":"","@default":""}}],[/./,{cases:{"@eos":{token:"",next:"@popall"},"@default":""}}]],whitespace:[[/\s+/,{cases:{"@eos":{token:"",next:"@popall"},"@default":""}}]],comment:[[/(^#.*$)/,"comment","@popall"]],strings:[[/\\'$/,"","@popall"],[/\\'/,""],[/'$/,"string","@popall"],[/'/,"string","@stringBody"],[/"$/,"string","@popall"],[/"/,"string","@dblStringBody"]],stringBody:[[/[^\\\$']/,{cases:{"@eos":{token:"string",next:"@popall"},"@default":"string"}}],[/\\./,"string.escape"],[/'$/,"string","@popall"],[/'/,"string","@pop"],[/(@variable)/,"variable"],[/\\$/,"string"],[/$/,"string","@popall"]],dblStringBody:[[/[^\\\$"]/,{cases:{"@eos":{token:"string",next:"@popall"},"@default":"string"}}],[/\\./,"string.escape"],[/"$/,"string","@popall"],[/"/,"string","@pop"],[/(@variable)/,"variable"],[/\\$/,"string"],[/$/,"string","@popall"]]}}}));

File diff suppressed because it is too large
+ 6 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/ecl/ecl.js


File diff suppressed because it is too large
+ 6 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/fsharp/fsharp.js


File diff suppressed because it is too large
+ 6 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/go/go.js


File diff suppressed because it is too large
+ 6 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/graphql/graphql.js


File diff suppressed because it is too large
+ 6 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/handlebars/handlebars.js


File diff suppressed because it is too large
+ 6 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/hcl/hcl.js


File diff suppressed because it is too large
+ 6 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/html/html.js


+ 7 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/ini/ini.js

@@ -0,0 +1,7 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53)
+ * Released under the MIT license
+ * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/ini/ini",["require","exports"],(function(e,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.language=n.conf=void 0,n.conf={comments:{lineComment:"#"},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}]},n.language={defaultToken:"",tokenPostfix:".ini",escapes:/\\(?:[abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,tokenizer:{root:[[/^\[[^\]]*\]/,"metatag"],[/(^\w+)(\s*)(\=)/,["key","","delimiter"]],{include:"@whitespace"},[/\d+/,"number"],[/"([^"\\]|\\.)*$/,"string.invalid"],[/'([^'\\]|\\.)*$/,"string.invalid"],[/"/,"string",'@string."'],[/'/,"string","@string.'"]],whitespace:[[/[ \t\r\n]+/,""],[/^\s*[#;].*$/,"comment"]],string:[[/[^\\"']+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/["']/,{cases:{"$#==$S2":{token:"string",next:"@pop"},"@default":"string"}}]]}}}));

File diff suppressed because it is too large
+ 6 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/java/java.js


File diff suppressed because it is too large
+ 6 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/javascript/javascript.js


File diff suppressed because it is too large
+ 6 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/julia/julia.js


File diff suppressed because it is too large
+ 6 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/kotlin/kotlin.js


File diff suppressed because it is too large
+ 6 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/less/less.js


File diff suppressed because it is too large
+ 6 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/lexon/lexon.js


File diff suppressed because it is too large
+ 6 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/lua/lua.js


File diff suppressed because it is too large
+ 6 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/m3/m3.js


File diff suppressed because it is too large
+ 6 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/markdown/markdown.js


File diff suppressed because it is too large
+ 6 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/mips/mips.js


File diff suppressed because it is too large
+ 6 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/msdax/msdax.js


File diff suppressed because it is too large
+ 6 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/mysql/mysql.js


File diff suppressed because it is too large
+ 6 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/objective-c/objective-c.js


File diff suppressed because it is too large
+ 6 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/pascal/pascal.js


File diff suppressed because it is too large
+ 6 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/pascaligo/pascaligo.js


File diff suppressed because it is too large
+ 6 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/perl/perl.js


File diff suppressed because it is too large
+ 6 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/pgsql/pgsql.js


File diff suppressed because it is too large
+ 6 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/php/php.js


File diff suppressed because it is too large
+ 6 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/postiats/postiats.js


File diff suppressed because it is too large
+ 6 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/powerquery/powerquery.js


File diff suppressed because it is too large
+ 6 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/powershell/powershell.js


File diff suppressed because it is too large
+ 6 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/pug/pug.js


File diff suppressed because it is too large
+ 6 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/python/python.js


File diff suppressed because it is too large
+ 6 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/r/r.js


File diff suppressed because it is too large
+ 6 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/razor/razor.js


File diff suppressed because it is too large
+ 6 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/redis/redis.js


File diff suppressed because it is too large
+ 6 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/redshift/redshift.js


File diff suppressed because it is too large
+ 6 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/restructuredtext/restructuredtext.js


File diff suppressed because it is too large
+ 6 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/ruby/ruby.js


File diff suppressed because it is too large
+ 6 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/rust/rust.js


+ 7 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/sb/sb.js

@@ -0,0 +1,7 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53)
+ * Released under the MIT license
+ * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/sb/sb",["require","exports"],(function(e,o){"use strict";Object.defineProperty(o,"__esModule",{value:!0}),o.language=o.conf=void 0,o.conf={comments:{lineComment:"'"},brackets:[["(",")"],["[","]"],["If","EndIf"],["While","EndWhile"],["For","EndFor"],["Sub","EndSub"]],autoClosingPairs:[{open:'"',close:'"',notIn:["string","comment"]},{open:"(",close:")",notIn:["string","comment"]},{open:"[",close:"]",notIn:["string","comment"]}]},o.language={defaultToken:"",tokenPostfix:".sb",ignoreCase:!0,brackets:[{token:"delimiter.array",open:"[",close:"]"},{token:"delimiter.parenthesis",open:"(",close:")"},{token:"keyword.tag-if",open:"If",close:"EndIf"},{token:"keyword.tag-while",open:"While",close:"EndWhile"},{token:"keyword.tag-for",open:"For",close:"EndFor"},{token:"keyword.tag-sub",open:"Sub",close:"EndSub"}],keywords:["Else","ElseIf","EndFor","EndIf","EndSub","EndWhile","For","Goto","If","Step","Sub","Then","To","While"],tagwords:["If","Sub","While","For"],operators:[">","<","<>","<=",">=","And","Or","+","-","*","/","="],identifier:/[a-zA-Z_][\w]*/,symbols:/[=><:+\-*\/%\.,]+/,escapes:/\\(?:[abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,tokenizer:{root:[{include:"@whitespace"},[/(@identifier)(?=[.])/,"type"],[/@identifier/,{cases:{"@keywords":{token:"keyword.$0"},"@operators":"operator","@default":"variable.name"}}],[/([.])(@identifier)/,{cases:{$2:["delimiter","type.member"],"@default":""}}],[/\d*\.\d+/,"number.float"],[/\d+/,"number"],[/[()\[\]]/,"@brackets"],[/@symbols/,{cases:{"@operators":"operator","@default":"delimiter"}}],[/"([^"\\]|\\.)*$/,"string.invalid"],[/"/,"string","@string"]],whitespace:[[/[ \t\r\n]+/,""],[/(\').*$/,"comment"]],string:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"C?/,"string","@pop"]]}}}));

File diff suppressed because it is too large
+ 6 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/scala/scala.js


+ 7 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/scheme/scheme.js

@@ -0,0 +1,7 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53)
+ * Released under the MIT license
+ * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/scheme/scheme",["require","exports"],(function(e,o){"use strict";Object.defineProperty(o,"__esModule",{value:!0}),o.language=o.conf=void 0,o.conf={comments:{lineComment:";",blockComment:["#|","|#"]},brackets:[["(",")"],["{","}"],["[","]"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'}]},o.language={defaultToken:"",ignoreCase:!0,tokenPostfix:".scheme",brackets:[{open:"(",close:")",token:"delimiter.parenthesis"},{open:"{",close:"}",token:"delimiter.curly"},{open:"[",close:"]",token:"delimiter.square"}],keywords:["case","do","let","loop","if","else","when","cons","car","cdr","cond","lambda","lambda*","syntax-rules","format","set!","quote","eval","append","list","list?","member?","load"],constants:["#t","#f"],operators:["eq?","eqv?","equal?","and","or","not","null?"],tokenizer:{root:[[/#[xXoObB][0-9a-fA-F]+/,"number.hex"],[/[+-]?\d+(?:(?:\.\d*)?(?:[eE][+-]?\d+)?)?/,"number.float"],[/(?:\b(?:(define|define-syntax|define-macro))\b)(\s+)((?:\w|\-|\!|\?)*)/,["keyword","white","variable"]],{include:"@whitespace"},{include:"@strings"},[/[a-zA-Z_#][a-zA-Z0-9_\-\?\!\*]*/,{cases:{"@keywords":"keyword","@constants":"constant","@operators":"operators","@default":"identifier"}}]],comment:[[/[^\|#]+/,"comment"],[/#\|/,"comment","@push"],[/\|#/,"comment","@pop"],[/[\|#]/,"comment"]],whitespace:[[/[ \t\r\n]+/,"white"],[/#\|/,"comment","@comment"],[/;.*$/,"comment"]],strings:[[/"$/,"string","@popall"],[/"(?=.)/,"string","@multiLineString"]],multiLineString:[[/[^\\"]+$/,"string","@popall"],[/[^\\"]+/,"string"],[/\\./,"string.escape"],[/"/,"string","@popall"],[/\\$/,"string"]]}}}));

File diff suppressed because it is too large
+ 6 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/scss/scss.js


File diff suppressed because it is too large
+ 6 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/shell/shell.js


File diff suppressed because it is too large
+ 6 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/solidity/solidity.js


File diff suppressed because it is too large
+ 6 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/sophia/sophia.js


File diff suppressed because it is too large
+ 6 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/sql/sql.js


File diff suppressed because it is too large
+ 6 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/st/st.js


File diff suppressed because it is too large
+ 9 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/swift/swift.js


File diff suppressed because it is too large
+ 6 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/systemverilog/systemverilog.js


File diff suppressed because it is too large
+ 6 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/tcl/tcl.js


File diff suppressed because it is too large
+ 6 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/twig/twig.js


File diff suppressed because it is too large
+ 6 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/typescript/typescript.js


File diff suppressed because it is too large
+ 6 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/vb/vb.js


File diff suppressed because it is too large
+ 6 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/xml/xml.js


File diff suppressed because it is too large
+ 6 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/basic-languages/yaml/yaml.js


File diff suppressed because it is too large
+ 5 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/editor/editor.main.css


File diff suppressed because it is too large
+ 5 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/editor/editor.main.js


File diff suppressed because it is too large
+ 5 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/editor/editor.main.nls.de.js


File diff suppressed because it is too large
+ 5 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/editor/editor.main.nls.es.js


File diff suppressed because it is too large
+ 5 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/editor/editor.main.nls.fr.js


File diff suppressed because it is too large
+ 5 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/editor/editor.main.nls.it.js


File diff suppressed because it is too large
+ 5 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/editor/editor.main.nls.ja.js


File diff suppressed because it is too large
+ 0 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/editor/editor.main.nls.js


File diff suppressed because it is too large
+ 5 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/editor/editor.main.nls.ko.js


File diff suppressed because it is too large
+ 5 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/editor/editor.main.nls.ru.js


File diff suppressed because it is too large
+ 5 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/editor/editor.main.nls.zh-cn.js


File diff suppressed because it is too large
+ 5 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/editor/editor.main.nls.zh-tw.js


File diff suppressed because it is too large
+ 6 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/language/css/cssMode.js


File diff suppressed because it is too large
+ 6 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/language/css/cssWorker.js


File diff suppressed because it is too large
+ 6 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/language/html/htmlMode.js


File diff suppressed because it is too large
+ 6 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/language/html/htmlWorker.js


File diff suppressed because it is too large
+ 6 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/language/json/jsonMode.js


File diff suppressed because it is too large
+ 6 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/language/json/jsonWorker.js


File diff suppressed because it is too large
+ 6 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/language/typescript/tsMode.js


File diff suppressed because it is too large
+ 20 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/language/typescript/tsWorker.js


File diff suppressed because it is too large
+ 5 - 0
yudao-admin-ui/public/libs/monaco-editor/vs/loader.js


+ 629 - 0
yudao-admin-ui/src/components/generator/config.js

@@ -0,0 +1,629 @@
+// 表单属性【右面板】
+export const formConf = {
+  formRef: 'elForm',
+  formModel: 'formData',
+  size: 'medium',
+  labelPosition: 'right',
+  labelWidth: 100,
+  formRules: 'rules',
+  gutter: 15,
+  disabled: false,
+  span: 24,
+  formBtns: true
+}
+
+// 输入型组件 【左面板】
+export const inputComponents = [
+  {
+    // 组件的自定义配置
+    __config__: {
+      label: '单行文本',
+      labelWidth: null,
+      showLabel: true,
+      changeTag: true,
+      tag: 'el-input',
+      tagIcon: 'input',
+      defaultValue: undefined,
+      required: true,
+      layout: 'colFormItem',
+      span: 24,
+      document: 'https://element.eleme.cn/#/zh-CN/component/input',
+      // 正则校验规则
+      regList: []
+    },
+    // 组件的插槽属性
+    __slot__: {
+      prepend: '',
+      append: ''
+    },
+    // 其余的为可直接写在组件标签上的属性
+    placeholder: '请输入',
+    style: { width: '100%' },
+    clearable: true,
+    'prefix-icon': '',
+    'suffix-icon': '',
+    maxlength: null,
+    'show-word-limit': false,
+    readonly: false,
+    disabled: false
+  },
+  {
+    __config__: {
+      label: '多行文本',
+      labelWidth: null,
+      showLabel: true,
+      tag: 'el-input',
+      tagIcon: 'textarea',
+      defaultValue: undefined,
+      required: true,
+      layout: 'colFormItem',
+      span: 24,
+      regList: [],
+      changeTag: true,
+      document: 'https://element.eleme.cn/#/zh-CN/component/input'
+    },
+    type: 'textarea',
+    placeholder: '请输入',
+    autosize: {
+      minRows: 4,
+      maxRows: 4
+    },
+    style: { width: '100%' },
+    maxlength: null,
+    'show-word-limit': false,
+    readonly: false,
+    disabled: false
+  },
+  {
+    __config__: {
+      label: '密码',
+      showLabel: true,
+      labelWidth: null,
+      changeTag: true,
+      tag: 'el-input',
+      tagIcon: 'password',
+      defaultValue: undefined,
+      layout: 'colFormItem',
+      span: 24,
+      required: true,
+      regList: [],
+      document: 'https://element.eleme.cn/#/zh-CN/component/input'
+    },
+    __slot__: {
+      prepend: '',
+      append: ''
+    },
+    placeholder: '请输入',
+    'show-password': true,
+    style: { width: '100%' },
+    clearable: true,
+    'prefix-icon': '',
+    'suffix-icon': '',
+    maxlength: null,
+    'show-word-limit': false,
+    readonly: false,
+    disabled: false
+  },
+  {
+    __config__: {
+      label: '计数器',
+      showLabel: true,
+      changeTag: true,
+      labelWidth: null,
+      tag: 'el-input-number',
+      tagIcon: 'number',
+      defaultValue: undefined,
+      span: 24,
+      layout: 'colFormItem',
+      required: true,
+      regList: [],
+      document: 'https://element.eleme.cn/#/zh-CN/component/input-number'
+    },
+    placeholder: '',
+    min: undefined,
+    max: undefined,
+    step: 1,
+    'step-strictly': false,
+    precision: undefined,
+    'controls-position': '',
+    disabled: false
+  },
+  {
+    __config__: {
+      label: '编辑器',
+      showLabel: true,
+      changeTag: true,
+      labelWidth: null,
+      tag: 'tinymce',
+      tagIcon: 'rich-text',
+      defaultValue: null,
+      span: 24,
+      layout: 'colFormItem',
+      required: true,
+      regList: [],
+      document: 'http://tinymce.ax-z.cn'
+    },
+    placeholder: '请输入',
+    height: 300, // 编辑器高度
+    branding: false // 隐藏右下角品牌烙印
+  }
+]
+
+// 选择型组件 【左面板】
+export const selectComponents = [
+  {
+    __config__: {
+      label: '下拉选择',
+      showLabel: true,
+      labelWidth: null,
+      tag: 'el-select',
+      tagIcon: 'select',
+      layout: 'colFormItem',
+      span: 24,
+      required: true,
+      regList: [],
+      changeTag: true,
+      document: 'https://element.eleme.cn/#/zh-CN/component/select'
+    },
+    __slot__: {
+      options: [{
+        label: '选项一',
+        value: 1
+      }, {
+        label: '选项二',
+        value: 2
+      }]
+    },
+    placeholder: '请选择',
+    style: { width: '100%' },
+    clearable: true,
+    disabled: false,
+    filterable: false,
+    multiple: false
+  },
+  {
+    __config__: {
+      label: '级联选择',
+      url: 'https://www.fastmock.site/mock/f8d7a54fb1e60561e2f720d5a810009d/fg/cascaderList',
+      method: 'get',
+      dataPath: 'list',
+      dataConsumer: 'options',
+      showLabel: true,
+      labelWidth: null,
+      tag: 'el-cascader',
+      tagIcon: 'cascader',
+      layout: 'colFormItem',
+      defaultValue: [],
+      dataType: 'dynamic',
+      span: 24,
+      required: true,
+      regList: [],
+      changeTag: true,
+      document: 'https://element.eleme.cn/#/zh-CN/component/cascader'
+    },
+    options: [{
+      id: 1,
+      value: 1,
+      label: '选项1',
+      children: [{
+        id: 2,
+        value: 2,
+        label: '选项1-1'
+      }]
+    }],
+    placeholder: '请选择',
+    style: { width: '100%' },
+    props: {
+      props: {
+        multiple: false,
+        label: 'label',
+        value: 'value',
+        children: 'children'
+      }
+    },
+    'show-all-levels': true,
+    disabled: false,
+    clearable: true,
+    filterable: false,
+    separator: '/'
+  },
+  {
+    __config__: {
+      label: '单选框组',
+      labelWidth: null,
+      showLabel: true,
+      tag: 'el-radio-group',
+      tagIcon: 'radio',
+      changeTag: true,
+      defaultValue: undefined,
+      layout: 'colFormItem',
+      span: 24,
+      optionType: 'default',
+      regList: [],
+      required: true,
+      border: false,
+      document: 'https://element.eleme.cn/#/zh-CN/component/radio'
+    },
+    __slot__: {
+      options: [{
+        label: '选项一',
+        value: 1
+      }, {
+        label: '选项二',
+        value: 2
+      }]
+    },
+    style: {},
+    size: 'medium',
+    disabled: false
+  },
+  {
+    __config__: {
+      label: '多选框组',
+      tag: 'el-checkbox-group',
+      tagIcon: 'checkbox',
+      defaultValue: [],
+      span: 24,
+      showLabel: true,
+      labelWidth: null,
+      layout: 'colFormItem',
+      optionType: 'default',
+      required: true,
+      regList: [],
+      changeTag: true,
+      border: false,
+      document: 'https://element.eleme.cn/#/zh-CN/component/checkbox'
+    },
+    __slot__: {
+      options: [{
+        label: '选项一',
+        value: 1
+      }, {
+        label: '选项二',
+        value: 2
+      }]
+    },
+    style: {},
+    size: 'medium',
+    min: null,
+    max: null,
+    disabled: false
+  },
+  {
+    __config__: {
+      label: '开关',
+      tag: 'el-switch',
+      tagIcon: 'switch',
+      defaultValue: false,
+      span: 24,
+      showLabel: true,
+      labelWidth: null,
+      layout: 'colFormItem',
+      required: true,
+      regList: [],
+      changeTag: true,
+      document: 'https://element.eleme.cn/#/zh-CN/component/switch'
+    },
+    style: {},
+    disabled: false,
+    'active-text': '',
+    'inactive-text': '',
+    'active-color': null,
+    'inactive-color': null,
+    'active-value': true,
+    'inactive-value': false
+  },
+  {
+    __config__: {
+      label: '滑块',
+      tag: 'el-slider',
+      tagIcon: 'slider',
+      defaultValue: null,
+      span: 24,
+      showLabel: true,
+      layout: 'colFormItem',
+      labelWidth: null,
+      required: true,
+      regList: [],
+      changeTag: true,
+      document: 'https://element.eleme.cn/#/zh-CN/component/slider'
+    },
+    disabled: false,
+    min: 0,
+    max: 100,
+    step: 1,
+    'show-stops': false,
+    range: false
+  },
+  {
+    __config__: {
+      label: '时间选择',
+      tag: 'el-time-picker',
+      tagIcon: 'time',
+      defaultValue: null,
+      span: 24,
+      showLabel: true,
+      layout: 'colFormItem',
+      labelWidth: null,
+      required: true,
+      regList: [],
+      changeTag: true,
+      document: 'https://element.eleme.cn/#/zh-CN/component/time-picker'
+    },
+    placeholder: '请选择',
+    style: { width: '100%' },
+    disabled: false,
+    clearable: true,
+    'picker-options': {
+      selectableRange: '00:00:00-23:59:59'
+    },
+    format: 'HH:mm:ss',
+    'value-format': 'HH:mm:ss'
+  },
+  {
+    __config__: {
+      label: '时间范围',
+      tag: 'el-time-picker',
+      tagIcon: 'time-range',
+      span: 24,
+      showLabel: true,
+      labelWidth: null,
+      layout: 'colFormItem',
+      defaultValue: null,
+      required: true,
+      regList: [],
+      changeTag: true,
+      document: 'https://element.eleme.cn/#/zh-CN/component/time-picker'
+    },
+    style: { width: '100%' },
+    disabled: false,
+    clearable: true,
+    'is-range': true,
+    'range-separator': '至',
+    'start-placeholder': '开始时间',
+    'end-placeholder': '结束时间',
+    format: 'HH:mm:ss',
+    'value-format': 'HH:mm:ss'
+  },
+  {
+    __config__: {
+      label: '日期选择',
+      tag: 'el-date-picker',
+      tagIcon: 'date',
+      defaultValue: null,
+      showLabel: true,
+      labelWidth: null,
+      span: 24,
+      layout: 'colFormItem',
+      required: true,
+      regList: [],
+      changeTag: true,
+      document: 'https://element.eleme.cn/#/zh-CN/component/date-picker'
+    },
+    placeholder: '请选择',
+    type: 'date',
+    style: { width: '100%' },
+    disabled: false,
+    clearable: true,
+    format: 'yyyy-MM-dd',
+    'value-format': 'yyyy-MM-dd',
+    readonly: false
+  },
+  {
+    __config__: {
+      label: '日期范围',
+      tag: 'el-date-picker',
+      tagIcon: 'date-range',
+      defaultValue: null,
+      span: 24,
+      showLabel: true,
+      labelWidth: null,
+      required: true,
+      layout: 'colFormItem',
+      regList: [],
+      changeTag: true,
+      document: 'https://element.eleme.cn/#/zh-CN/component/date-picker'
+    },
+    style: { width: '100%' },
+    type: 'daterange',
+    'range-separator': '至',
+    'start-placeholder': '开始日期',
+    'end-placeholder': '结束日期',
+    disabled: false,
+    clearable: true,
+    format: 'yyyy-MM-dd',
+    'value-format': 'yyyy-MM-dd',
+    readonly: false
+  },
+  {
+    __config__: {
+      label: '评分',
+      tag: 'el-rate',
+      tagIcon: 'rate',
+      defaultValue: 0,
+      span: 24,
+      showLabel: true,
+      labelWidth: null,
+      layout: 'colFormItem',
+      required: true,
+      regList: [],
+      changeTag: true,
+      document: 'https://element.eleme.cn/#/zh-CN/component/rate'
+    },
+    style: {},
+    max: 5,
+    'allow-half': false,
+    'show-text': false,
+    'show-score': false,
+    disabled: false
+  },
+  {
+    __config__: {
+      label: '颜色选择',
+      tag: 'el-color-picker',
+      tagIcon: 'color',
+      span: 24,
+      defaultValue: null,
+      showLabel: true,
+      labelWidth: null,
+      layout: 'colFormItem',
+      required: true,
+      regList: [],
+      changeTag: true,
+      document: 'https://element.eleme.cn/#/zh-CN/component/color-picker'
+    },
+    'show-alpha': false,
+    'color-format': '',
+    disabled: false,
+    size: 'medium'
+  },
+  {
+    __config__: {
+      label: '上传',
+      tag: 'el-upload',
+      tagIcon: 'upload',
+      layout: 'colFormItem',
+      defaultValue: null,
+      showLabel: true,
+      labelWidth: null,
+      required: true,
+      span: 24,
+      showTip: false,
+      buttonText: '点击上传',
+      regList: [],
+      changeTag: true,
+      fileSize: 2,
+      sizeUnit: 'MB',
+      document: 'https://element.eleme.cn/#/zh-CN/component/upload'
+    },
+    __slot__: {
+      'list-type': true
+    },
+    action: 'https://jsonplaceholder.typicode.com/posts/',
+    disabled: false,
+    accept: '',
+    name: 'file',
+    'auto-upload': true,
+    'list-type': 'text',
+    multiple: false
+  }
+]
+
+// 布局型组件 【左面板】
+export const layoutComponents = [
+  {
+    __config__: {
+      layout: 'rowFormItem',
+      tagIcon: 'row',
+      label: '行容器',
+      layoutTree: true,
+      document: 'https://element.eleme.cn/#/zh-CN/component/layout#row-attributes'
+    },
+    type: 'default',
+    justify: 'start',
+    align: 'top'
+  },
+  {
+    __config__: {
+      label: '按钮',
+      showLabel: true,
+      changeTag: true,
+      labelWidth: null,
+      tag: 'el-button',
+      tagIcon: 'button',
+      span: 24,
+      layout: 'colFormItem',
+      document: 'https://element.eleme.cn/#/zh-CN/component/button'
+    },
+    __slot__: {
+      default: '主要按钮'
+    },
+    type: 'primary',
+    icon: 'el-icon-search',
+    round: false,
+    size: 'medium',
+    plain: false,
+    circle: false,
+    disabled: false
+  },
+  {
+    __config__: {
+      layout: 'colFormItem',
+      tagIcon: 'table',
+      tag: 'el-table',
+      document: 'https://element.eleme.cn/#/zh-CN/component/table',
+      span: 24,
+      formId: 101,
+      renderKey: 1595761764203,
+      componentName: 'row101',
+      showLabel: true,
+      changeTag: true,
+      labelWidth: null,
+      label: '表格[开发中]',
+      dataType: 'dynamic',
+      method: 'get',
+      dataPath: 'list',
+      dataConsumer: 'data',
+      url: 'https://www.fastmock.site/mock/f8d7a54fb1e60561e2f720d5a810009d/fg/tableData',
+      children: [{
+        __config__: {
+          layout: 'raw',
+          tag: 'el-table-column',
+          renderKey: 15957617660153
+        },
+        prop: 'date',
+        label: '日期'
+      }, {
+        __config__: {
+          layout: 'raw',
+          tag: 'el-table-column',
+          renderKey: 15957617660152
+        },
+        prop: 'address',
+        label: '地址'
+      }, {
+        __config__: {
+          layout: 'raw',
+          tag: 'el-table-column',
+          renderKey: 15957617660151
+        },
+        prop: 'name',
+        label: '名称'
+      }, {
+        __config__: {
+          layout: 'raw',
+          tag: 'el-table-column',
+          renderKey: 1595774496335,
+          children: [
+            {
+              __config__: {
+                label: '按钮',
+                tag: 'el-button',
+                tagIcon: 'button',
+                layout: 'raw',
+                renderKey: 1595779809901
+              },
+              __slot__: {
+                default: '主要按钮'
+              },
+              type: 'primary',
+              icon: 'el-icon-search',
+              round: false,
+              size: 'medium'
+            }
+          ]
+        },
+        label: '操作'
+      }]
+    },
+    data: [],
+    directives: [{
+      name: 'loading',
+      value: true
+    }],
+    border: true,
+    type: 'default',
+    justify: 'start',
+    align: 'top'
+  }
+]

+ 18 - 0
yudao-admin-ui/src/components/generator/css.js

@@ -0,0 +1,18 @@
+const styles = {
+  'el-rate': '.el-rate{display: inline-block; vertical-align: text-top;}',
+  'el-upload': '.el-upload__tip{line-height: 1.2;}'
+}
+
+function addCss(cssList, el) {
+  const css = styles[el.__config__.tag]
+  css && cssList.indexOf(css) === -1 && cssList.push(css)
+  if (el.__config__.children) {
+    el.__config__.children.forEach(el2 => addCss(cssList, el2))
+  }
+}
+
+export function makeUpCss(conf) {
+  const cssList = []
+  conf.fields.forEach(el => addCss(cssList, el))
+  return cssList.join('\n')
+}

+ 37 - 0
yudao-admin-ui/src/components/generator/drawingDefalut.js

@@ -0,0 +1,37 @@
+export default [
+  {
+    __config__: {
+      label: '单行文本',
+      labelWidth: null,
+      showLabel: true,
+      changeTag: true,
+      tag: 'el-input',
+      tagIcon: 'input',
+      defaultValue: undefined,
+      required: true,
+      layout: 'colFormItem',
+      span: 24,
+      document: 'https://element.eleme.cn/#/zh-CN/component/input',
+      // 正则校验规则
+      regList: [{
+        pattern: '/^1(3|4|5|7|8|9)\\d{9}$/',
+        message: '手机号格式错误'
+      }]
+    },
+    // 组件的插槽属性
+    __slot__: {
+      prepend: '',
+      append: ''
+    },
+    __vModel__: 'mobile',
+    placeholder: '请输入手机号',
+    style: { width: '100%' },
+    clearable: true,
+    'prefix-icon': 'el-icon-mobile',
+    'suffix-icon': '',
+    maxlength: 11,
+    'show-word-limit': true,
+    readonly: false,
+    disabled: false
+  }
+]

+ 399 - 0
yudao-admin-ui/src/components/generator/html.js

@@ -0,0 +1,399 @@
+/* eslint-disable max-len */
+import ruleTrigger from './ruleTrigger'
+
+let confGlobal
+let someSpanIsNot24
+
+export function dialogWrapper(str) {
+  return `<el-dialog v-bind="$attrs" v-on="$listeners" @open="onOpen" @close="onClose" title="Dialog Titile">
+    ${str}
+    <div slot="footer">
+      <el-button @click="close">取消</el-button>
+      <el-button type="primary" @click="handelConfirm">确定</el-button>
+    </div>
+  </el-dialog>`
+}
+
+export function vueTemplate(str) {
+  return `<template>
+    <div>
+      ${str}
+    </div>
+  </template>`
+}
+
+export function vueScript(str) {
+  return `<script>
+    ${str}
+  </script>`
+}
+
+export function cssStyle(cssStr) {
+  return `<style>
+    ${cssStr}
+  </style>`
+}
+
+function buildFormTemplate(scheme, child, type) {
+  let labelPosition = ''
+  if (scheme.labelPosition !== 'right') {
+    labelPosition = `label-position="${scheme.labelPosition}"`
+  }
+  const disabled = scheme.disabled ? `:disabled="${scheme.disabled}"` : ''
+  let str = `<el-form ref="${scheme.formRef}" :model="${scheme.formModel}" :rules="${scheme.formRules}" size="${scheme.size}" ${disabled} label-width="${scheme.labelWidth}px" ${labelPosition}>
+      ${child}
+      ${buildFromBtns(scheme, type)}
+    </el-form>`
+  if (someSpanIsNot24) {
+    str = `<el-row :gutter="${scheme.gutter}">
+        ${str}
+      </el-row>`
+  }
+  return str
+}
+
+function buildFromBtns(scheme, type) {
+  let str = ''
+  if (scheme.formBtns && type === 'file') {
+    str = `<el-form-item size="large">
+          <el-button type="primary" @click="submitForm">提交</el-button>
+          <el-button @click="resetForm">重置</el-button>
+        </el-form-item>`
+    if (someSpanIsNot24) {
+      str = `<el-col :span="24">
+          ${str}
+        </el-col>`
+    }
+  }
+  return str
+}
+
+// span不为24的用el-col包裹
+function colWrapper(scheme, str) {
+  if (someSpanIsNot24 || scheme.__config__.span !== 24) {
+    return `<el-col :span="${scheme.__config__.span}">
+      ${str}
+    </el-col>`
+  }
+  return str
+}
+
+const layouts = {
+  colFormItem(scheme) {
+    const config = scheme.__config__
+    let labelWidth = ''
+    let label = `label="${config.label}"`
+    if (config.labelWidth && config.labelWidth !== confGlobal.labelWidth) {
+      labelWidth = `label-width="${config.labelWidth}px"`
+    }
+    if (config.showLabel === false) {
+      labelWidth = 'label-width="0"'
+      label = ''
+    }
+    const required = !ruleTrigger[config.tag] && config.required ? 'required' : ''
+    const tagDom = tags[config.tag] ? tags[config.tag](scheme) : null
+    let str = `<el-form-item ${labelWidth} ${label} prop="${scheme.__vModel__}" ${required}>
+        ${tagDom}
+      </el-form-item>`
+    str = colWrapper(scheme, str)
+    return str
+  },
+  rowFormItem(scheme) {
+    const config = scheme.__config__
+    const type = scheme.type === 'default' ? '' : `type="${scheme.type}"`
+    const justify = scheme.type === 'default' ? '' : `justify="${scheme.justify}"`
+    const align = scheme.type === 'default' ? '' : `align="${scheme.align}"`
+    const gutter = scheme.gutter ? `:gutter="${scheme.gutter}"` : ''
+    const children = config.children.map(el => layouts[el.__config__.layout](el))
+    let str = `<el-row ${type} ${justify} ${align} ${gutter}>
+      ${children.join('\n')}
+    </el-row>`
+    str = colWrapper(scheme, str)
+    return str
+  }
+}
+
+const tags = {
+  'el-button': el => {
+    const {
+      tag, disabled
+    } = attrBuilder(el)
+    const type = el.type ? `type="${el.type}"` : ''
+    const icon = el.icon ? `icon="${el.icon}"` : ''
+    const round = el.round ? 'round' : ''
+    const size = el.size ? `size="${el.size}"` : ''
+    const plain = el.plain ? 'plain' : ''
+    const circle = el.circle ? 'circle' : ''
+    let child = buildElButtonChild(el)
+
+    if (child) child = `\n${child}\n` // 换行
+    return `<${tag} ${type} ${icon} ${round} ${size} ${plain} ${disabled} ${circle}>${child}</${tag}>`
+  },
+  'el-input': el => {
+    const {
+      tag, disabled, vModel, clearable, placeholder, width
+    } = attrBuilder(el)
+    const maxlength = el.maxlength ? `:maxlength="${el.maxlength}"` : ''
+    const showWordLimit = el['show-word-limit'] ? 'show-word-limit' : ''
+    const readonly = el.readonly ? 'readonly' : ''
+    const prefixIcon = el['prefix-icon'] ? `prefix-icon='${el['prefix-icon']}'` : ''
+    const suffixIcon = el['suffix-icon'] ? `suffix-icon='${el['suffix-icon']}'` : ''
+    const showPassword = el['show-password'] ? 'show-password' : ''
+    const type = el.type ? `type="${el.type}"` : ''
+    const autosize = el.autosize && el.autosize.minRows
+      ? `:autosize="{minRows: ${el.autosize.minRows}, maxRows: ${el.autosize.maxRows}}"`
+      : ''
+    let child = buildElInputChild(el)
+
+    if (child) child = `\n${child}\n` // 换行
+    return `<${tag} ${vModel} ${type} ${placeholder} ${maxlength} ${showWordLimit} ${readonly} ${disabled} ${clearable} ${prefixIcon} ${suffixIcon} ${showPassword} ${autosize} ${width}>${child}</${tag}>`
+  },
+  'el-input-number': el => {
+    const {
+      tag, disabled, vModel, placeholder
+    } = attrBuilder(el)
+    const controlsPosition = el['controls-position'] ? `controls-position=${el['controls-position']}` : ''
+    const min = el.min ? `:min='${el.min}'` : ''
+    const max = el.max ? `:max='${el.max}'` : ''
+    const step = el.step ? `:step='${el.step}'` : ''
+    const stepStrictly = el['step-strictly'] ? 'step-strictly' : ''
+    const precision = el.precision ? `:precision='${el.precision}'` : ''
+
+    return `<${tag} ${vModel} ${placeholder} ${step} ${stepStrictly} ${precision} ${controlsPosition} ${min} ${max} ${disabled}></${tag}>`
+  },
+  'el-select': el => {
+    const {
+      tag, disabled, vModel, clearable, placeholder, width
+    } = attrBuilder(el)
+    const filterable = el.filterable ? 'filterable' : ''
+    const multiple = el.multiple ? 'multiple' : ''
+    let child = buildElSelectChild(el)
+
+    if (child) child = `\n${child}\n` // 换行
+    return `<${tag} ${vModel} ${placeholder} ${disabled} ${multiple} ${filterable} ${clearable} ${width}>${child}</${tag}>`
+  },
+  'el-radio-group': el => {
+    const { tag, disabled, vModel } = attrBuilder(el)
+    const size = `size="${el.size}"`
+    let child = buildElRadioGroupChild(el)
+
+    if (child) child = `\n${child}\n` // 换行
+    return `<${tag} ${vModel} ${size} ${disabled}>${child}</${tag}>`
+  },
+  'el-checkbox-group': el => {
+    const { tag, disabled, vModel } = attrBuilder(el)
+    const size = `size="${el.size}"`
+    const min = el.min ? `:min="${el.min}"` : ''
+    const max = el.max ? `:max="${el.max}"` : ''
+    let child = buildElCheckboxGroupChild(el)
+
+    if (child) child = `\n${child}\n` // 换行
+    return `<${tag} ${vModel} ${min} ${max} ${size} ${disabled}>${child}</${tag}>`
+  },
+  'el-switch': el => {
+    const { tag, disabled, vModel } = attrBuilder(el)
+    const activeText = el['active-text'] ? `active-text="${el['active-text']}"` : ''
+    const inactiveText = el['inactive-text'] ? `inactive-text="${el['inactive-text']}"` : ''
+    const activeColor = el['active-color'] ? `active-color="${el['active-color']}"` : ''
+    const inactiveColor = el['inactive-color'] ? `inactive-color="${el['inactive-color']}"` : ''
+    const activeValue = el['active-value'] !== true ? `:active-value='${JSON.stringify(el['active-value'])}'` : ''
+    const inactiveValue = el['inactive-value'] !== false ? `:inactive-value='${JSON.stringify(el['inactive-value'])}'` : ''
+
+    return `<${tag} ${vModel} ${activeText} ${inactiveText} ${activeColor} ${inactiveColor} ${activeValue} ${inactiveValue} ${disabled}></${tag}>`
+  },
+  'el-cascader': el => {
+    const {
+      tag, disabled, vModel, clearable, placeholder, width
+    } = attrBuilder(el)
+    const options = el.options ? `:options="${el.__vModel__}Options"` : ''
+    const props = el.props ? `:props="${el.__vModel__}Props"` : ''
+    const showAllLevels = el['show-all-levels'] ? '' : ':show-all-levels="false"'
+    const filterable = el.filterable ? 'filterable' : ''
+    const separator = el.separator === '/' ? '' : `separator="${el.separator}"`
+
+    return `<${tag} ${vModel} ${options} ${props} ${width} ${showAllLevels} ${placeholder} ${separator} ${filterable} ${clearable} ${disabled}></${tag}>`
+  },
+  'el-slider': el => {
+    const { tag, disabled, vModel } = attrBuilder(el)
+    const min = el.min ? `:min='${el.min}'` : ''
+    const max = el.max ? `:max='${el.max}'` : ''
+    const step = el.step ? `:step='${el.step}'` : ''
+    const range = el.range ? 'range' : ''
+    const showStops = el['show-stops'] ? `:show-stops="${el['show-stops']}"` : ''
+
+    return `<${tag} ${min} ${max} ${step} ${vModel} ${range} ${showStops} ${disabled}></${tag}>`
+  },
+  'el-time-picker': el => {
+    const {
+      tag, disabled, vModel, clearable, placeholder, width
+    } = attrBuilder(el)
+    const startPlaceholder = el['start-placeholder'] ? `start-placeholder="${el['start-placeholder']}"` : ''
+    const endPlaceholder = el['end-placeholder'] ? `end-placeholder="${el['end-placeholder']}"` : ''
+    const rangeSeparator = el['range-separator'] ? `range-separator="${el['range-separator']}"` : ''
+    const isRange = el['is-range'] ? 'is-range' : ''
+    const format = el.format ? `format="${el.format}"` : ''
+    const valueFormat = el['value-format'] ? `value-format="${el['value-format']}"` : ''
+    const pickerOptions = el['picker-options'] ? `:picker-options='${JSON.stringify(el['picker-options'])}'` : ''
+
+    return `<${tag} ${vModel} ${isRange} ${format} ${valueFormat} ${pickerOptions} ${width} ${placeholder} ${startPlaceholder} ${endPlaceholder} ${rangeSeparator} ${clearable} ${disabled}></${tag}>`
+  },
+  'el-date-picker': el => {
+    const {
+      tag, disabled, vModel, clearable, placeholder, width
+    } = attrBuilder(el)
+    const startPlaceholder = el['start-placeholder'] ? `start-placeholder="${el['start-placeholder']}"` : ''
+    const endPlaceholder = el['end-placeholder'] ? `end-placeholder="${el['end-placeholder']}"` : ''
+    const rangeSeparator = el['range-separator'] ? `range-separator="${el['range-separator']}"` : ''
+    const format = el.format ? `format="${el.format}"` : ''
+    const valueFormat = el['value-format'] ? `value-format="${el['value-format']}"` : ''
+    const type = el.type === 'date' ? '' : `type="${el.type}"`
+    const readonly = el.readonly ? 'readonly' : ''
+
+    return `<${tag} ${type} ${vModel} ${format} ${valueFormat} ${width} ${placeholder} ${startPlaceholder} ${endPlaceholder} ${rangeSeparator} ${clearable} ${readonly} ${disabled}></${tag}>`
+  },
+  'el-rate': el => {
+    const { tag, disabled, vModel } = attrBuilder(el)
+    const max = el.max ? `:max='${el.max}'` : ''
+    const allowHalf = el['allow-half'] ? 'allow-half' : ''
+    const showText = el['show-text'] ? 'show-text' : ''
+    const showScore = el['show-score'] ? 'show-score' : ''
+
+    return `<${tag} ${vModel} ${max} ${allowHalf} ${showText} ${showScore} ${disabled}></${tag}>`
+  },
+  'el-color-picker': el => {
+    const { tag, disabled, vModel } = attrBuilder(el)
+    const size = `size="${el.size}"`
+    const showAlpha = el['show-alpha'] ? 'show-alpha' : ''
+    const colorFormat = el['color-format'] ? `color-format="${el['color-format']}"` : ''
+
+    return `<${tag} ${vModel} ${size} ${showAlpha} ${colorFormat} ${disabled}></${tag}>`
+  },
+  'el-upload': el => {
+    const { tag } = el.__config__
+    const disabled = el.disabled ? ':disabled=\'true\'' : ''
+    const action = el.action ? `:action="${el.__vModel__}Action"` : ''
+    const multiple = el.multiple ? 'multiple' : ''
+    const listType = el['list-type'] !== 'text' ? `list-type="${el['list-type']}"` : ''
+    const accept = el.accept ? `accept="${el.accept}"` : ''
+    const name = el.name !== 'file' ? `name="${el.name}"` : ''
+    const autoUpload = el['auto-upload'] === false ? ':auto-upload="false"' : ''
+    const beforeUpload = `:before-upload="${el.__vModel__}BeforeUpload"`
+    const fileList = `:file-list="${el.__vModel__}fileList"`
+    const ref = `ref="${el.__vModel__}"`
+    let child = buildElUploadChild(el)
+
+    if (child) child = `\n${child}\n` // 换行
+    return `<${tag} ${ref} ${fileList} ${action} ${autoUpload} ${multiple} ${beforeUpload} ${listType} ${accept} ${name} ${disabled}>${child}</${tag}>`
+  },
+  tinymce: el => {
+    const { tag, vModel, placeholder } = attrBuilder(el)
+    const height = el.height ? `:height="${el.height}"` : ''
+    const branding = el.branding ? `:branding="${el.branding}"` : ''
+    return `<${tag} ${vModel} ${placeholder} ${height} ${branding}></${tag}>`
+  }
+}
+
+function attrBuilder(el) {
+  return {
+    tag: el.__config__.tag,
+    vModel: `v-model="${confGlobal.formModel}.${el.__vModel__}"`,
+    clearable: el.clearable ? 'clearable' : '',
+    placeholder: el.placeholder ? `placeholder="${el.placeholder}"` : '',
+    width: el.style && el.style.width ? ':style="{width: \'100%\'}"' : '',
+    disabled: el.disabled ? ':disabled=\'true\'' : ''
+  }
+}
+
+// el-buttin 子级
+function buildElButtonChild(scheme) {
+  const children = []
+  const slot = scheme.__slot__ || {}
+  if (slot.default) {
+    children.push(slot.default)
+  }
+  return children.join('\n')
+}
+
+// el-input 子级
+function buildElInputChild(scheme) {
+  const children = []
+  const slot = scheme.__slot__
+  if (slot && slot.prepend) {
+    children.push(`<template slot="prepend">${slot.prepend}</template>`)
+  }
+  if (slot && slot.append) {
+    children.push(`<template slot="append">${slot.append}</template>`)
+  }
+  return children.join('\n')
+}
+
+// el-select 子级
+function buildElSelectChild(scheme) {
+  const children = []
+  const slot = scheme.__slot__
+  if (slot && slot.options && slot.options.length) {
+    children.push(`<el-option v-for="(item, index) in ${scheme.__vModel__}Options" :key="index" :label="item.label" :value="item.value" :disabled="item.disabled"></el-option>`)
+  }
+  return children.join('\n')
+}
+
+// el-radio-group 子级
+function buildElRadioGroupChild(scheme) {
+  const children = []
+  const slot = scheme.__slot__
+  const config = scheme.__config__
+  if (slot && slot.options && slot.options.length) {
+    const tag = config.optionType === 'button' ? 'el-radio-button' : 'el-radio'
+    const border = config.border ? 'border' : ''
+    children.push(`<${tag} v-for="(item, index) in ${scheme.__vModel__}Options" :key="index" :label="item.value" :disabled="item.disabled" ${border}>{{item.label}}</${tag}>`)
+  }
+  return children.join('\n')
+}
+
+// el-checkbox-group 子级
+function buildElCheckboxGroupChild(scheme) {
+  const children = []
+  const slot = scheme.__slot__
+  const config = scheme.__config__
+  if (slot && slot.options && slot.options.length) {
+    const tag = config.optionType === 'button' ? 'el-checkbox-button' : 'el-checkbox'
+    const border = config.border ? 'border' : ''
+    children.push(`<${tag} v-for="(item, index) in ${scheme.__vModel__}Options" :key="index" :label="item.value" :disabled="item.disabled" ${border}>{{item.label}}</${tag}>`)
+  }
+  return children.join('\n')
+}
+
+// el-upload 子级
+function buildElUploadChild(scheme) {
+  const list = []
+  const config = scheme.__config__
+  if (scheme['list-type'] === 'picture-card') list.push('<i class="el-icon-plus"></i>')
+  else list.push(`<el-button size="small" type="primary" icon="el-icon-upload">${config.buttonText}</el-button>`)
+  if (config.showTip) list.push(`<div slot="tip" class="el-upload__tip">只能上传不超过 ${config.fileSize}${config.sizeUnit} 的${scheme.accept}文件</div>`)
+  return list.join('\n')
+}
+
+/**
+ * 组装html代码。【入口函数】
+ * @param {Object} formConfig 整个表单配置
+ * @param {String} type 生成类型,文件或弹窗等
+ */
+export function makeUpHtml(formConfig, type) {
+  const htmlList = []
+  confGlobal = formConfig
+  // 判断布局是否都沾满了24个栅格,以备后续简化代码结构
+  someSpanIsNot24 = formConfig.fields.some(item => item.__config__.span !== 24)
+  // 遍历渲染每个组件成html
+  formConfig.fields.forEach(el => {
+    htmlList.push(layouts[el.__config__.layout](el))
+  })
+  const htmlStr = htmlList.join('\n')
+  // 将组件代码放进form标签
+  let temp = buildFormTemplate(formConfig, htmlStr, type)
+  // dialog标签包裹代码
+  if (type === 'dialog') {
+    temp = dialogWrapper(temp)
+  }
+  confGlobal = null
+  return temp
+}

+ 271 - 0
yudao-admin-ui/src/components/generator/js.js

@@ -0,0 +1,271 @@
+import { isArray } from 'util'
+import { exportDefault, titleCase, deepClone } from '@/utils/index'
+import ruleTrigger from './ruleTrigger'
+
+const units = {
+  KB: '1024',
+  MB: '1024 / 1024',
+  GB: '1024 / 1024 / 1024'
+}
+let confGlobal
+const inheritAttrs = {
+  file: '',
+  dialog: 'inheritAttrs: false,'
+}
+
+/**
+ * 组装js 【入口函数】
+ * @param {Object} formConfig 整个表单配置
+ * @param {String} type 生成类型,文件或弹窗等
+ */
+export function makeUpJs(formConfig, type) {
+  confGlobal = formConfig = deepClone(formConfig)
+  const dataList = []
+  const ruleList = []
+  const optionsList = []
+  const propsList = []
+  const methodList = mixinMethod(type)
+  const uploadVarList = []
+  const created = []
+
+  formConfig.fields.forEach(el => {
+    buildAttributes(el, dataList, ruleList, optionsList, methodList, propsList, uploadVarList, created)
+  })
+
+  const script = buildexport(
+    formConfig,
+    type,
+    dataList.join('\n'),
+    ruleList.join('\n'),
+    optionsList.join('\n'),
+    uploadVarList.join('\n'),
+    propsList.join('\n'),
+    methodList.join('\n'),
+    created.join('\n')
+  )
+  confGlobal = null
+  return script
+}
+
+// 构建组件属性
+function buildAttributes(scheme, dataList, ruleList, optionsList, methodList, propsList, uploadVarList, created) {
+  const config = scheme.__config__
+  const slot = scheme.__slot__
+  buildData(scheme, dataList)
+  buildRules(scheme, ruleList)
+
+  // 特殊处理options属性
+  if (scheme.options || (slot && slot.options && slot.options.length)) {
+    buildOptions(scheme, optionsList)
+    if (config.dataType === 'dynamic') {
+      const model = `${scheme.__vModel__}Options`
+      const options = titleCase(model)
+      const methodName = `get${options}`
+      buildOptionMethod(methodName, model, methodList, scheme)
+      callInCreated(methodName, created)
+    }
+  }
+
+  // 处理props
+  if (scheme.props && scheme.props.props) {
+    buildProps(scheme, propsList)
+  }
+
+  // 处理el-upload的action
+  if (scheme.action && config.tag === 'el-upload') {
+    uploadVarList.push(
+      `${scheme.__vModel__}Action: '${scheme.action}',
+      ${scheme.__vModel__}fileList: [],`
+    )
+    methodList.push(buildBeforeUpload(scheme))
+    // 非自动上传时,生成手动上传的函数
+    if (!scheme['auto-upload']) {
+      methodList.push(buildSubmitUpload(scheme))
+    }
+  }
+
+  // 构建子级组件属性
+  if (config.children) {
+    config.children.forEach(item => {
+      buildAttributes(item, dataList, ruleList, optionsList, methodList, propsList, uploadVarList, created)
+    })
+  }
+}
+
+// 在Created调用函数
+function callInCreated(methodName, created) {
+  created.push(`this.${methodName}()`)
+}
+
+// 混入处理函数
+function mixinMethod(type) {
+  const list = []; const
+    minxins = {
+      file: confGlobal.formBtns ? {
+        submitForm: `submitForm() {
+        this.$refs['${confGlobal.formRef}'].validate(valid => {
+          if(!valid) return
+          // TODO 提交表单
+        })
+      },`,
+        resetForm: `resetForm() {
+        this.$refs['${confGlobal.formRef}'].resetFields()
+      },`
+      } : null,
+      dialog: {
+        onOpen: 'onOpen() {},',
+        onClose: `onClose() {
+        this.$refs['${confGlobal.formRef}'].resetFields()
+      },`,
+        close: `close() {
+        this.$emit('update:visible', false)
+      },`,
+        handelConfirm: `handelConfirm() {
+        this.$refs['${confGlobal.formRef}'].validate(valid => {
+          if(!valid) return
+          this.close()
+        })
+      },`
+      }
+    }
+
+  const methods = minxins[type]
+  if (methods) {
+    Object.keys(methods).forEach(key => {
+      list.push(methods[key])
+    })
+  }
+
+  return list
+}
+
+// 构建data
+function buildData(scheme, dataList) {
+  const config = scheme.__config__
+  if (scheme.__vModel__ === undefined) return
+  const defaultValue = JSON.stringify(config.defaultValue)
+  dataList.push(`${scheme.__vModel__}: ${defaultValue},`)
+}
+
+// 构建校验规则
+function buildRules(scheme, ruleList) {
+  const config = scheme.__config__
+  if (scheme.__vModel__ === undefined) return
+  const rules = []
+  if (ruleTrigger[config.tag]) {
+    if (config.required) {
+      const type = isArray(config.defaultValue) ? 'type: \'array\',' : ''
+      let message = isArray(config.defaultValue) ? `请至少选择一个${config.label}` : scheme.placeholder
+      if (message === undefined) message = `${config.label}不能为空`
+      rules.push(`{ required: true, ${type} message: '${message}', trigger: '${ruleTrigger[config.tag]}' }`)
+    }
+    if (config.regList && isArray(config.regList)) {
+      config.regList.forEach(item => {
+        if (item.pattern) {
+          rules.push(
+            `{ pattern: ${eval(item.pattern)}, message: '${item.message}', trigger: '${ruleTrigger[config.tag]}' }`
+          )
+        }
+      })
+    }
+    ruleList.push(`${scheme.__vModel__}: [${rules.join(',')}],`)
+  }
+}
+
+// 构建options
+function buildOptions(scheme, optionsList) {
+  if (scheme.__vModel__ === undefined) return
+  // el-cascader直接有options属性,其他组件都是定义在slot中,所以有两处判断
+  let { options } = scheme
+  if (!options) options = scheme.__slot__.options
+  if (scheme.__config__.dataType === 'dynamic') { options = [] }
+  const str = `${scheme.__vModel__}Options: ${JSON.stringify(options)},`
+  optionsList.push(str)
+}
+
+function buildProps(scheme, propsList) {
+  const str = `${scheme.__vModel__}Props: ${JSON.stringify(scheme.props.props)},`
+  propsList.push(str)
+}
+
+// el-upload的BeforeUpload
+function buildBeforeUpload(scheme) {
+  const config = scheme.__config__
+  const unitNum = units[config.sizeUnit]; let rightSizeCode = ''; let acceptCode = ''; const
+    returnList = []
+  if (config.fileSize) {
+    rightSizeCode = `let isRightSize = file.size / ${unitNum} < ${config.fileSize}
+    if(!isRightSize){
+      this.$message.error('文件大小超过 ${config.fileSize}${config.sizeUnit}')
+    }`
+    returnList.push('isRightSize')
+  }
+  if (scheme.accept) {
+    acceptCode = `let isAccept = new RegExp('${scheme.accept}').test(file.type)
+    if(!isAccept){
+      this.$message.error('应该选择${scheme.accept}类型的文件')
+    }`
+    returnList.push('isAccept')
+  }
+  const str = `${scheme.__vModel__}BeforeUpload(file) {
+    ${rightSizeCode}
+    ${acceptCode}
+    return ${returnList.join('&&')}
+  },`
+  return returnList.length ? str : ''
+}
+
+// el-upload的submit
+function buildSubmitUpload(scheme) {
+  const str = `submitUpload() {
+    this.$refs['${scheme.__vModel__}'].submit()
+  },`
+  return str
+}
+
+function buildOptionMethod(methodName, model, methodList, scheme) {
+  const config = scheme.__config__
+  const str = `${methodName}() {
+    // 注意:this.$axios是通过Vue.prototype.$axios = axios挂载产生的
+    this.$axios({
+      method: '${config.method}',
+      url: '${config.url}'
+    }).then(resp => {
+      var { data } = resp
+      this.${model} = data.${config.dataPath}
+    })
+  },`
+  methodList.push(str)
+}
+
+// js整体拼接
+function buildexport(conf, type, data, rules, selectOptions, uploadVar, props, methods, created) {
+  const str = `${exportDefault}{
+  ${inheritAttrs[type]}
+  components: {},
+  props: [],
+  data () {
+    return {
+      ${conf.formModel}: {
+        ${data}
+      },
+      ${conf.formRules}: {
+        ${rules}
+      },
+      ${uploadVar}
+      ${selectOptions}
+      ${props}
+    }
+  },
+  computed: {},
+  watch: {},
+  created () {
+    ${created}
+  },
+  mounted () {},
+  methods: {
+    ${methods}
+  }
+}`
+  return str
+}

+ 16 - 0
yudao-admin-ui/src/components/generator/ruleTrigger.js

@@ -0,0 +1,16 @@
+/**
+ * 用于生成表单校验,指定正则规则的触发方式。
+ * 未在此处声明无触发方式的组件将不生成rule!!
+ */
+export default {
+  'el-input': 'blur',
+  'el-input-number': 'blur',
+  'el-select': 'change',
+  'el-radio-group': 'change',
+  'el-checkbox-group': 'change',
+  'el-cascader': 'change',
+  'el-time-picker': 'change',
+  'el-date-picker': 'change',
+  'el-rate': 'change',
+  tinymce: 'blur'
+}

+ 186 - 0
yudao-admin-ui/src/components/parser/Parser.vue

@@ -0,0 +1,186 @@
+<script>
+import { deepClone } from '@/utils/index'
+import render from '@/components/render/render.js'
+
+const ruleTrigger = {
+  'el-input': 'blur',
+  'el-input-number': 'blur',
+  'el-select': 'change',
+  'el-radio-group': 'change',
+  'el-checkbox-group': 'change',
+  'el-cascader': 'change',
+  'el-time-picker': 'change',
+  'el-date-picker': 'change',
+  'el-rate': 'change'
+}
+
+const layouts = {
+  colFormItem(h, scheme) {
+    const config = scheme.__config__
+    const listeners = buildListeners.call(this, scheme)
+
+    let labelWidth = config.labelWidth ? `${config.labelWidth}px` : null
+    if (config.showLabel === false) labelWidth = '0'
+    return (
+      <el-col span={config.span}>
+        <el-form-item label-width={labelWidth} prop={scheme.__vModel__}
+          label={config.showLabel ? config.label : ''}>
+          <render conf={scheme} on={listeners} />
+        </el-form-item>
+      </el-col>
+    )
+  },
+  rowFormItem(h, scheme) {
+    let child = renderChildren.apply(this, arguments)
+    if (scheme.type === 'flex') {
+      child = <el-row type={scheme.type} justify={scheme.justify} align={scheme.align}>
+              {child}
+            </el-row>
+    }
+    return (
+      <el-col span={scheme.span}>
+        <el-row gutter={scheme.gutter}>
+          {child}
+        </el-row>
+      </el-col>
+    )
+  }
+}
+
+function renderFrom(h) {
+  const { formConfCopy } = this
+
+  return (
+    <el-row gutter={formConfCopy.gutter}>
+      <el-form
+        size={formConfCopy.size}
+        label-position={formConfCopy.labelPosition}
+        disabled={formConfCopy.disabled}
+        label-width={`${formConfCopy.labelWidth}px`}
+        ref={formConfCopy.formRef}
+        // model不能直接赋值 https://github.com/vuejs/jsx/issues/49#issuecomment-472013664
+        props={{ model: this[formConfCopy.formModel] }}
+        rules={this[formConfCopy.formRules]}
+      >
+        {renderFormItem.call(this, h, formConfCopy.fields)}
+        {formConfCopy.formBtns && formBtns.call(this, h)}
+      </el-form>
+    </el-row>
+  )
+}
+
+function formBtns(h) {
+  return <el-col>
+    <el-form-item size="large">
+      <el-button type="primary" onClick={this.submitForm}>提交</el-button>
+      <el-button onClick={this.resetForm}>重置</el-button>
+    </el-form-item>
+  </el-col>
+}
+
+function renderFormItem(h, elementList) {
+  return elementList.map(scheme => {
+    const config = scheme.__config__
+    const layout = layouts[config.layout]
+
+    if (layout) {
+      return layout.call(this, h, scheme)
+    }
+    throw new Error(`没有与${config.layout}匹配的layout`)
+  })
+}
+
+function renderChildren(h, scheme) {
+  const config = scheme.__config__
+  if (!Array.isArray(config.children)) return null
+  return renderFormItem.call(this, h, config.children)
+}
+
+function setValue(event, config, scheme) {
+  this.$set(config, 'defaultValue', event)
+  this.$set(this[this.formConf.formModel], scheme.__vModel__, event)
+}
+
+function buildListeners(scheme) {
+  const config = scheme.__config__
+  const methods = this.formConf.__methods__ || {}
+  const listeners = {}
+
+  // 给__methods__中的方法绑定this和event
+  Object.keys(methods).forEach(key => {
+    listeners[key] = event => methods[key].call(this, event)
+  })
+  // 响应 render.js 中的 vModel $emit('input', val)
+  listeners.input = event => setValue.call(this, event, config, scheme)
+
+  return listeners
+}
+
+export default {
+  components: {
+    render
+  },
+  props: {
+    formConf: {
+      type: Object,
+      required: true
+    }
+  },
+  data() {
+    const data = {
+      formConfCopy: deepClone(this.formConf),
+      [this.formConf.formModel]: {},
+      [this.formConf.formRules]: {}
+    }
+    this.initFormData(data.formConfCopy.fields, data[this.formConf.formModel])
+    this.buildRules(data.formConfCopy.fields, data[this.formConf.formRules])
+    return data
+  },
+  methods: {
+    initFormData(componentList, formData) {
+      componentList.forEach(cur => {
+        const config = cur.__config__
+        if (cur.__vModel__) formData[cur.__vModel__] = config.defaultValue
+        if (config.children) this.initFormData(config.children, formData)
+      })
+    },
+    buildRules(componentList, rules) {
+      componentList.forEach(cur => {
+        const config = cur.__config__
+        if (Array.isArray(config.regList)) {
+          if (config.required) {
+            const required = { required: config.required, message: cur.placeholder }
+            if (Array.isArray(config.defaultValue)) {
+              required.type = 'array'
+              required.message = `请至少选择一个${config.label}`
+            }
+            required.message === undefined && (required.message = `${config.label}不能为空`)
+            config.regList.push(required)
+          }
+          rules[cur.__vModel__] = config.regList.map(item => {
+            item.pattern && (item.pattern = eval(item.pattern))
+            item.trigger = ruleTrigger && ruleTrigger[config.tag]
+            return item
+          })
+        }
+        if (config.children) this.buildRules(config.children, rules)
+      })
+    },
+    resetForm() {
+      this.formConfCopy = deepClone(this.formConf)
+      this.$refs[this.formConf.formRef].resetFields()
+    },
+    submitForm() {
+      this.$refs[this.formConf.formRef].validate(valid => {
+        if (!valid) return false
+        // 触发sumit事件
+        this.$emit('submit', this[this.formConf.formModel])
+        return true
+      })
+    }
+  },
+  render(h) {
+    return renderFrom.call(this, h)
+  }
+}
+</script>

+ 17 - 0
yudao-admin-ui/src/components/parser/README.md

@@ -0,0 +1,17 @@
+## form-generator JSON 解析器
+>用于将form-generator导出的JSON解析成一个表单。
+
+### 安装组件
+```
+npm i form-gen-parser
+```
+或者
+```
+yarn add form-gen-parser
+```
+
+### 使用示例
+> [查看在线示例](https://mrhj.gitee.io/form-generator/#/parser)  
+
+示例代码:  
+> [src\components\parser\example\Index.vue](https://github.com/JakHuang/form-generator/blob/dev/src/components/parser/example/Index.vue)

Some files were not shown because too many files changed in this diff