index.vue 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. <template>
  2. <ContentWrap>
  3. <el-row>
  4. <el-col>
  5. <div class="float-right mb-2">
  6. <el-button size="small" type="primary" @click="showJson">生成 JSON</el-button>
  7. <el-button size="small" type="success" @click="showOption">生成 Options</el-button>
  8. <el-button size="small" type="danger" @click="showTemplate">生成组件</el-button>
  9. </div>
  10. </el-col>
  11. <!-- 表单设计器 -->
  12. <el-col>
  13. <FcDesigner ref="designer" height="780px" />
  14. </el-col>
  15. </el-row>
  16. </ContentWrap>
  17. <!-- 弹窗:表单预览 -->
  18. <Dialog v-model="dialogVisible" :title="dialogTitle" max-height="600">
  19. <div v-if="dialogVisible" ref="editor">
  20. <XTextButton style="float: right" :title="t('common.copy')" @click="copy(formData)" />
  21. <el-scrollbar height="580">
  22. <div>
  23. <pre><code class="hljs" v-dompurify-html="highlightedCode(formData)"></code></pre>
  24. </div>
  25. </el-scrollbar>
  26. </div>
  27. </Dialog>
  28. </template>
  29. <script lang="ts" setup>
  30. import FcDesigner from '@form-create/designer'
  31. // import { useClipboard } from '@vueuse/core'
  32. import { isString } from '@/utils/is'
  33. import hljs from 'highlight.js' // 导入代码高亮文件
  34. import 'highlight.js/styles/github.css' // 导入代码高亮样式
  35. import xml from 'highlight.js/lib/languages/java'
  36. import json from 'highlight.js/lib/languages/json'
  37. import formCreate from '@form-create/element-ui'
  38. defineOptions({ name: 'InfraBuild' })
  39. const { t } = useI18n() // 国际化
  40. const message = useMessage() // 消息
  41. const designer = ref() // 表单设计器
  42. const dialogVisible = ref(false) // 弹窗的是否展示
  43. const dialogTitle = ref('') // 弹窗的标题
  44. const formType = ref(-1) // 表单的类型:0 - 生成 JSON;1 - 生成 Options;2 - 生成组件
  45. const formData = ref('') // 表单数据
  46. /** 打开弹窗 */
  47. const openModel = (title: string) => {
  48. dialogVisible.value = true
  49. dialogTitle.value = title
  50. }
  51. /** 生成 JSON */
  52. const showJson = () => {
  53. openModel('生成 JSON')
  54. formType.value = 0
  55. formData.value = designer.value.getRule()
  56. }
  57. /** 生成 Options */
  58. const showOption = () => {
  59. openModel('生成 Options')
  60. formType.value = 1
  61. formData.value = designer.value.getOption()
  62. }
  63. /** 生成组件 */
  64. const showTemplate = () => {
  65. openModel('生成组件')
  66. formType.value = 2
  67. formData.value = makeTemplate()
  68. }
  69. const makeTemplate = () => {
  70. const rule = designer.value.getRule()
  71. const opt = designer.value.getOption()
  72. return `<template>
  73. <form-create
  74. v-model="fapi"
  75. :rule="rule"
  76. :option="option"
  77. @submit="onSubmit"
  78. ></form-create>
  79. </template>
  80. <script lang="ts" setup>
  81. import formCreate from "@form-create/element-ui";
  82. const faps = ref(null)
  83. const rule = ref('')
  84. const option = ref('')
  85. const init = () => {
  86. rule.value = formCreate.parseJson('${formCreate.toJson(rule).replaceAll('\\', '\\\\')}')
  87. option.value = formCreate.parseJson('${JSON.stringify(opt)}')
  88. }
  89. const onSubmit = (formData) => {
  90. //todo 提交表单
  91. }
  92. init()
  93. <\/script>`
  94. }
  95. /** 复制 **/
  96. const copy = async (text: string) => {
  97. // const { copy, copied, isSupported } = useClipboard({ source: JSON.stringify(text) })
  98. // if (!isSupported.value) {
  99. // message.error(t('common.copyError'))
  100. // } else {
  101. // await copy()
  102. // if (unref(copied.value)) {
  103. // message.success(t('common.copySuccess'))
  104. // }
  105. // }
  106. let url = JSON.stringify(text)
  107. let oInput = document.createElement('textarea')
  108. oInput.value = url
  109. document.body.appendChild(oInput)
  110. oInput.select() // 选择对象;
  111. // console.log(oInput.value)
  112. document.execCommand('Copy') // 执行浏览器复制命令
  113. message.success(t('common.copySuccess'))
  114. oInput.remove()
  115. }
  116. /**
  117. * 代码高亮
  118. */
  119. const highlightedCode = (code) => {
  120. // 处理语言和代码
  121. let language = 'json'
  122. if (formType.value === 2) {
  123. language = 'xml'
  124. }
  125. if (!isString(code)) {
  126. code = JSON.stringify(code)
  127. }
  128. // 高亮
  129. const result = hljs.highlight(language, code, true)
  130. return result.value || '&nbsp;'
  131. }
  132. /** 初始化 **/
  133. onMounted(async () => {
  134. // 注册代码高亮的各种语言
  135. hljs.registerLanguage('xml', xml)
  136. hljs.registerLanguage('json', json)
  137. })
  138. </script>