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 || ' '
+}
+
+/** 鍒濆鍖� **/
+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