From a1d7e81859f554f3a53680cc35f0f49bf1f77098 Mon Sep 17 00:00:00 2001
From: wwf <1971391498@qq.com>
Date: 星期四, 14 五月 2026 14:37:02 +0800
Subject: [PATCH] 导入项目

---
 src/views/infra/build/index.vue |  184 ++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 184 insertions(+), 0 deletions(-)

diff --git a/src/views/infra/build/index.vue b/src/views/infra/build/index.vue
new file mode 100644
index 0000000..191fc90
--- /dev/null
+++ b/src/views/infra/build/index.vue
@@ -0,0 +1,184 @@
+<template>
+  <ContentWrap :body-style="{ padding: '0px' }" class="!mb-0">
+    <!-- 琛ㄥ崟璁捐鍣� -->
+    <div
+      class="h-[calc(100vh-var(--top-tool-height)-var(--tags-view-height)-var(--app-content-padding)-var(--app-content-padding)-2px)]"
+    >
+      <fc-designer class="my-designer" ref="designer" :config="designerConfig">
+        <template #handle>
+          <el-button size="small" type="primary" plain @click="showJson">鐢熸垚JSON</el-button>
+          <el-button size="small" type="success" plain @click="showOption">鐢熸垚Options</el-button>
+          <el-button size="small" type="danger" plain @click="showTemplate">鐢熸垚缁勪欢</el-button>
+        </template>
+      </fc-designer>
+    </div>
+  </ContentWrap>
+
+  <!-- 寮圭獥锛氳〃鍗曢瑙� -->
+  <Dialog v-model="dialogVisible" :title="dialogTitle" max-height="600">
+    <div v-if="dialogVisible" ref="editor">
+      <el-button style="float: right" @click="copy(formData)">
+        {{ t('common.copy') }}
+      </el-button>
+      <el-scrollbar height="580">
+        <div>
+          <pre><code v-dompurify-html="highlightedCode(formData)" class="hljs"></code></pre>
+        </div>
+      </el-scrollbar>
+    </div>
+  </Dialog>
+</template>
+<script lang="ts" setup>
+import { useFormCreateDesigner } from '@/components/FormCreate'
+import { useClipboard } from '@vueuse/core'
+import { isString } from '@/utils/is'
+
+import hljs from 'highlight.js' // 瀵煎叆浠g爜楂樹寒鏂囦欢
+import 'highlight.js/styles/github.css' // 瀵煎叆浠g爜楂樹寒鏍峰紡
+import xml from 'highlight.js/lib/languages/java'
+import json from 'highlight.js/lib/languages/json'
+import formCreate from '@form-create/element-ui'
+
+defineOptions({ name: 'InfraBuild' })
+
+const { t } = useI18n() // 鍥介檯鍖�
+const message = useMessage() // 娑堟伅
+
+// 琛ㄥ崟璁捐鍣ㄩ厤缃�
+const designerConfig = ref({
+  switchType: [], // 鏄惁鍙互鍒囨崲缁勪欢绫诲瀷,鎴栬�呭彲浠ョ浉浜掑垏鎹㈢殑瀛楁
+  autoActive: true, // 鏄惁鑷姩閫変腑鎷栧叆鐨勭粍浠�
+  useTemplate: false, // 鏄惁鐢熸垚vue2璇硶鐨勬ā鏉跨粍浠�
+  formOptions: {
+    form: {
+      labelWidth: '100px' // 璁剧疆榛樿鐨� label 瀹藉害涓� 100px
+    }
+  }, // 瀹氫箟琛ㄥ崟閰嶇疆榛樿鍊�
+  fieldReadonly: false, // 閰嶇疆field鏄惁鍙互缂栬緫
+  hiddenDragMenu: false, // 闅愯棌鎷栨嫿鎿嶄綔鎸夐挳
+  hiddenDragBtn: false, // 闅愯棌鎷栨嫿鎸夐挳
+  hiddenMenu: [], // 闅愯棌閮ㄥ垎鑿滃崟
+  hiddenItem: [], // 闅愯棌閮ㄥ垎缁勪欢
+  hiddenItemConfig: {}, // 闅愯棌缁勪欢鐨勯儴鍒嗛厤缃」
+  disabledItemConfig: {}, // 绂佺敤缁勪欢鐨勯儴鍒嗛厤缃」
+  showSaveBtn: false, // 鏄惁鏄剧ず淇濆瓨鎸夐挳
+  showConfig: true, // 鏄惁鏄剧ず鍙充晶鐨勯厤缃晫闈�
+  showBaseForm: true, // 鏄惁鏄剧ず缁勪欢鐨勫熀纭�閰嶇疆琛ㄥ崟
+  showControl: true, // 鏄惁鏄剧ず缁勪欢鑱斿姩
+  showPropsForm: true, // 鏄惁鏄剧ず缁勪欢鐨勫睘鎬ч厤缃〃鍗�
+  showEventForm: true, // 鏄惁鏄剧ず缁勪欢鐨勪簨浠堕厤缃〃鍗�
+  showValidateForm: true, // 鏄惁鏄剧ず缁勪欢鐨勯獙璇侀厤缃〃鍗�
+  showFormConfig: true, // 鏄惁鏄剧ず琛ㄥ崟閰嶇疆
+  showInputData: true, // 鏄惁鏄剧ず褰曞叆鎸夐挳
+  showDevice: true, // 鏄惁鏄剧ず澶氱閫傞厤閫夐」
+  appendConfigData: [] // 瀹氫箟娓叉煋瑙勫垯鎵�闇�鐨刦ormData
+})
+const designer = ref() // 琛ㄥ崟璁捐鍣�
+const dialogVisible = ref(false) // 寮圭獥鐨勬槸鍚﹀睍绀�
+const dialogTitle = ref('') // 寮圭獥鐨勬爣棰�
+const formType = ref(-1) // 琛ㄥ崟鐨勭被鍨嬶細0 - 鐢熸垚 JSON锛�1 - 鐢熸垚 Options锛�2 - 鐢熸垚缁勪欢
+const formData = ref('') // 琛ㄥ崟鏁版嵁
+useFormCreateDesigner(designer) // 琛ㄥ崟璁捐鍣ㄥ寮�
+
+/** 鎵撳紑寮圭獥 */
+const openModel = (title: string) => {
+  dialogVisible.value = true
+  dialogTitle.value = title
+}
+
+/** 鐢熸垚 JSON */
+const showJson = () => {
+  openModel('鐢熸垚 JSON')
+  formType.value = 0
+  formData.value = designer.value.getRule()
+}
+
+/** 鐢熸垚 Options */
+const showOption = () => {
+  openModel('鐢熸垚 Options')
+  formType.value = 1
+  formData.value = designer.value.getOption()
+}
+
+/** 鐢熸垚缁勪欢 */
+const showTemplate = () => {
+  openModel('鐢熸垚缁勪欢')
+  formType.value = 2
+  formData.value = makeTemplate()
+}
+
+const makeTemplate = () => {
+  const rule = designer.value.getRule()
+  const opt = designer.value.getOption()
+  return `<template>
+    <form-create
+      v-model:api="fApi"
+      :rule="rule"
+      :option="option"
+      @submit="onSubmit"
+    ></form-create>
+  </template>
+  <script setup lang=ts>
+    const faps = ref(null)
+    const rule = ref('')
+    const option = ref('')
+    const init = () => {
+      rule.value = formCreate.parseJson('${formCreate.toJson(rule).replaceAll('\\', '\\\\')}')
+      option.value = formCreate.parseJson('${JSON.stringify(opt)}')
+    }
+    const onSubmit = (formData) => {
+      //todo 鎻愪氦琛ㄥ崟
+    }
+    init()
+  <\/script>`
+}
+
+/** 澶嶅埗 **/
+const copy = async (text: string) => {
+  const textToCopy = JSON.stringify(text, null, 2)
+  const { copy, copied, isSupported } = useClipboard({ legacy: true, source: textToCopy })
+  if (!isSupported) {
+    message.error(t('common.copyError'))
+  } else {
+    await copy()
+    if (unref(copied)) {
+      message.success(t('common.copySuccess'))
+    }
+  }
+}
+
+/**
+ * 浠g爜楂樹寒
+ */
+const highlightedCode = (code: string) => {
+  // 澶勭悊璇█鍜屼唬鐮�
+  let language = 'json'
+  if (formType.value === 2) {
+    language = 'xml'
+  }
+  // debugger
+  if (!isString(code)) {
+    code = JSON.stringify(code, null, 2)
+  }
+  // 楂樹寒
+  const result = hljs.highlight(code, { language: language, ignoreIllegals: true })
+  return result.value || '&nbsp;'
+}
+
+/** 鍒濆鍖� **/
+onMounted(async () => {
+  // 娉ㄥ唽浠g爜楂樹寒鐨勫悇绉嶈瑷�
+  hljs.registerLanguage('xml', xml)
+  hljs.registerLanguage('json', json)
+})
+</script>
+
+<style>
+.my-designer {
+  ._fc-l,
+  ._fc-m,
+  ._fc-r {
+    border-top: none;
+  }
+}
+</style>

--
Gitblit v1.8.0