generateCode.js 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. function findRemoteFunc (list, funcList, tokenFuncList, blankList, optionList) {
  2. for (let i = 0; i < list.length; i++) {
  3. if (list[i].type == 'grid') {
  4. list[i].columns.forEach(item => {
  5. findRemoteFunc(item.list, funcList, tokenFuncList, blankList, optionList)
  6. })
  7. } else if (list[i].type == 'table') {
  8. findRemoteFunc(list[i].tableColumns, funcList, tokenFuncList, blankList, optionList)
  9. } else if (list[i].type == 'subform') {
  10. findRemoteFunc(list[i].list, funcList, tokenFuncList, blankList, optionList)
  11. } else if (list[i].type == 'tabs') {
  12. list[i].tabs.forEach(item => {
  13. findRemoteFunc(item.list, funcList, tokenFuncList, blankList, optionList)
  14. })
  15. } else if (list[i].type == 'collapse') {
  16. list[i].tabs.forEach(item => {
  17. findRemoteFunc(item.list, funcList, tokenFuncList, blankList, optionList)
  18. })
  19. } else if (list[i].type == 'report') {
  20. list[i].rows.forEach(row => {
  21. row.columns.forEach(col => {
  22. findRemoteFunc(col.list, funcList, tokenFuncList, blankList, optionList)
  23. })
  24. })
  25. } else if (list[i].type == 'inline') {
  26. findRemoteFunc(list[i].list, funcList, tokenFuncList, blankList, optionList)
  27. } else if (list[i].type == 'dialog') {
  28. findRemoteFunc(list[i].list, funcList, tokenFuncList, blankList, optionList)
  29. } else if (list[i].type == 'card') {
  30. findRemoteFunc(list[i].list, funcList, tokenFuncList, blankList, optionList)
  31. } else if (list[i].type == 'group') {
  32. findRemoteFunc(list[i].list, funcList, tokenFuncList, blankList, optionList)
  33. } else {
  34. if (list[i].type == 'blank') {
  35. if (list[i].model && blankList.findIndex(item => item.name == list[i].model) < 0) {
  36. blankList.push({
  37. name: list[i].model,
  38. label: list[i].name,
  39. dataBind: list[i].options.dataBind
  40. })
  41. }
  42. } else if (list[i].type == 'imgupload') {
  43. if (list[i].options.tokenType == 'func' && list[i].options.tokenFunc) {
  44. tokenFuncList.push({
  45. func: list[i].options.tokenFunc,
  46. label: list[i].name,
  47. model: list[i].model
  48. })
  49. }
  50. } else {
  51. if (list[i].options.remote && list[i].options.remoteType == 'func' && list[i].options.remoteFunc) {
  52. funcList.push({
  53. func: list[i].options.remoteFunc,
  54. label: list[i].name,
  55. model: list[i].model
  56. })
  57. }
  58. if (list[i].options.remote && list[i].options.remoteType == 'option' && list[i].options.remoteOption) {
  59. optionList.push({
  60. option: list[i].options.remoteOption,
  61. label: list[i].name,
  62. model: list[i].model
  63. })
  64. }
  65. }
  66. }
  67. }
  68. }
  69. export default function (data, type = 'html', ui = 'element') {
  70. const funcList = []
  71. const tokenFuncList = []
  72. const blankList = []
  73. const optionList = []
  74. const templateName = ui == 'element' ? 'fm-generate-form' : 'fm-generate-antd-form'
  75. const buttonName = ui == 'element' ? 'el-button' : 'a-button'
  76. const cdnjs = ui == 'element' ? 'https://unpkg.com/element-ui/lib/index.js' : 'https://unpkg.com/ant-design-vue@1.7.8/dist/antd.min.js'
  77. const cdncss = ui == 'element' ? 'https://unpkg.com/element-ui/lib/theme-chalk/index.css' : 'https://unpkg.com/ant-design-vue@1.7.8/dist/antd.min.css'
  78. findRemoteFunc(JSON.parse(data).list, funcList, tokenFuncList, blankList, optionList)
  79. let funcTemplate = ''
  80. let blankTemplate = ''
  81. let optionTemplate = ''
  82. for (let i = 0; i < optionList.length; i++) {
  83. optionTemplate += `
  84. ${optionList[i].option} : [], // ${optionList[i].label} option data
  85. `
  86. }
  87. for(let i = 0; i < funcList.length; i++) {
  88. funcTemplate += `
  89. ${funcList[i].func} (resolve) {
  90. // ${funcList[i].label} ${funcList[i].model}
  91. // resolve(data)
  92. },
  93. `
  94. }
  95. for(let i = 0; i < tokenFuncList.length; i++) {
  96. funcTemplate += `
  97. ${tokenFuncList[i].func} (resolve) {
  98. // ${tokenFuncList[i].label} ${tokenFuncList[i].model}
  99. // resolve(token)
  100. },
  101. `
  102. }
  103. for (let i = 0; i < blankList.length; i++) {
  104. if (blankList[i].dataBind) {
  105. blankTemplate += `
  106. <template slot="${blankList[i].name}" slot-scope="scope">
  107. <!-- ${blankList[i].label || blankList[i].name} -->
  108. <!-- use v-model="scope.model.${blankList[i].name}" to bind data -->
  109. </template>
  110. `
  111. } else {
  112. blankTemplate += `
  113. <template slot="${blankList[i].name}">
  114. <!-- ${blankList[i].label || blankList[i].name} -->
  115. </template>
  116. `
  117. }
  118. }
  119. if (type == 'html') {
  120. return `<!DOCTYPE html>
  121. <html>
  122. <head>
  123. <meta charset="UTF-8">
  124. <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no" />
  125. <link rel="stylesheet" href="${cdncss}">
  126. <link rel="stylesheet" href="https://form.making.link/public/lib/form-making/dist/FormMaking.css">
  127. </head>
  128. <body>
  129. <div id="app">
  130. <${templateName}
  131. :data="jsonData"
  132. :remote="remoteFuncs"
  133. :value="editData"
  134. :remote-option="dynamicData"
  135. ref="generateForm"
  136. >${blankTemplate}
  137. </${templateName}>
  138. </div>
  139. <script src="https://unpkg.com/vue@2.6.14"></script>${ui == 'antd' ? `\n\t<script src="https://unpkg.com/moment"></script>` : ''}
  140. <script src="${cdnjs}"></script>
  141. <script src="https://form.making.link/public/lib/form-making/dist/FormMaking.umd.js"></script>
  142. <script>
  143. new Vue({
  144. el: '#app',
  145. data: {
  146. jsonData: ${data},
  147. editData: {},
  148. remoteFuncs: {
  149. ${funcTemplate}
  150. },
  151. dynamicData: {
  152. ${optionTemplate}
  153. }
  154. }
  155. })
  156. </script>
  157. </body>
  158. </html>`
  159. } else {
  160. return `<template>
  161. <div>
  162. <${templateName}
  163. :data="jsonData"
  164. :remote="remoteFuncs"
  165. :value="editData"
  166. :remote-option="dynamicData"
  167. ref="generateForm"
  168. >${blankTemplate}
  169. </${templateName}>
  170. </div>
  171. </template>
  172. <script>
  173. export default {
  174. data () {
  175. return {
  176. jsonData: ${data},
  177. editData: {},
  178. remoteFuncs: {
  179. ${funcTemplate}
  180. },
  181. dynamicData: {
  182. ${optionTemplate}
  183. }
  184. }
  185. }
  186. }
  187. </script>`
  188. }
  189. }