From a1d7e81859f554f3a53680cc35f0f49bf1f77098 Mon Sep 17 00:00:00 2001
From: wwf <1971391498@qq.com>
Date: 星期四, 14 五月 2026 14:37:02 +0800
Subject: [PATCH] 导入项目
---
src/components/FormCreate/src/useFormCreateDesigner.ts | 165 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 165 insertions(+), 0 deletions(-)
diff --git a/src/components/FormCreate/src/useFormCreateDesigner.ts b/src/components/FormCreate/src/useFormCreateDesigner.ts
new file mode 100644
index 0000000..4e87e43
--- /dev/null
+++ b/src/components/FormCreate/src/useFormCreateDesigner.ts
@@ -0,0 +1,165 @@
+import {
+ useDictSelectRule,
+ useEditorRule,
+ useSelectRule,
+ useUploadFileRule,
+ useUploadImgRule,
+ useUploadImgsRule
+} from './config'
+import { Ref } from 'vue'
+import { Menu } from '@/components/FormCreate/src/type'
+import { apiSelectRule } from '@/components/FormCreate/src/config/selectRule'
+import { generateUUID } from '@/utils'
+
+/**
+ * 琛ㄥ崟璁捐鍣ㄥ寮� hook
+ * 鏂板
+ * - 鏂囦欢涓婁紶
+ * - 鍗曞浘涓婁紶
+ * - 澶氬浘涓婁紶
+ * - 瀛楀吀閫夋嫨鍣�
+ * - 鐢ㄦ埛閫夋嫨鍣�
+ * - 閮ㄩ棬閫夋嫨鍣�
+ * - 瀵屾枃鏈�
+ */
+export const useFormCreateDesigner = async (designer: Ref) => {
+ const editorRule = useEditorRule()
+ const uploadFileRule = useUploadFileRule()
+ const uploadImgRule = useUploadImgRule()
+ const uploadImgsRule = useUploadImgsRule()
+
+ /**
+ * 鏋勫缓琛ㄥ崟缁勪欢
+ */
+ const buildFormComponents = () => {
+ // 绉婚櫎鑷甫鐨勪笂浼犵粍浠惰鍒欙紝浣跨敤 uploadFileRule銆乽ploadImgRule銆乽ploadImgsRule 鏇夸唬
+ designer.value?.removeMenuItem('upload')
+ // 绉婚櫎鑷甫鐨勫瘜鏂囨湰缁勪欢瑙勫垯锛屼娇鐢� editorRule 鏇夸唬
+ designer.value?.removeMenuItem('fcEditor')
+ const components = [editorRule, uploadFileRule, uploadImgRule, uploadImgsRule]
+ components.forEach((component) => {
+ // 鎻掑叆缁勪欢瑙勫垯
+ designer.value?.addComponent(component)
+ // 鎻掑叆鎷栨嫿鎸夐挳鍒� `main` 鍒嗙被涓�
+ designer.value?.appendMenuItem('main', {
+ icon: component.icon,
+ name: component.name,
+ label: component.label
+ })
+ })
+ }
+
+ const userSelectRule = useSelectRule({
+ name: 'UserSelect',
+ label: '鐢ㄦ埛閫夋嫨鍣�',
+ icon: 'icon-user-o'
+ })
+ const deptSelectRule = useSelectRule({
+ name: 'DeptSelect',
+ label: '閮ㄩ棬閫夋嫨鍣�',
+ icon: 'icon-address-card-o',
+ props: [
+ {
+ type: 'select',
+ field: 'returnType',
+ title: '杩斿洖鍊肩被鍨�',
+ value: 'id',
+ options: [
+ { label: '閮ㄩ棬缂栧彿', value: 'id' },
+ { label: '閮ㄩ棬鍚嶇О', value: 'name' }
+ ]
+ }
+ ]
+ })
+ const dictSelectRule = useDictSelectRule()
+ const apiSelectRule0 = useSelectRule({
+ name: 'ApiSelect',
+ label: '鎺ュ彛閫夋嫨鍣�',
+ icon: 'icon-server',
+ props: [...apiSelectRule],
+ event: ['click', 'change', 'visibleChange', 'clear', 'blur', 'focus']
+ })
+
+ /**
+ * 鏋勫缓绯荤粺瀛楁鑿滃崟
+ */
+ const buildSystemMenu = () => {
+ // 绉婚櫎鑷甫鐨勪笅鎷夐�夋嫨鍣ㄧ粍浠讹紝浣跨敤 currencySelectRule 鏇夸唬
+ // designer.value?.removeMenuItem('select')
+ // designer.value?.removeMenuItem('radio')
+ // designer.value?.removeMenuItem('checkbox')
+ const components = [userSelectRule, deptSelectRule, dictSelectRule, apiSelectRule0]
+ const menu: Menu = {
+ name: 'system',
+ title: '绯荤粺瀛楁',
+ list: components.map((component) => {
+ // 鎻掑叆缁勪欢瑙勫垯
+ designer.value?.addComponent(component)
+ // 鎻掑叆鎷栨嫿鎸夐挳鍒� `system` 鍒嗙被涓�
+ return {
+ icon: component.icon,
+ name: component.name,
+ label: component.label
+ }
+ })
+ }
+ designer.value?.addMenu(menu)
+ }
+
+ /**
+ * 淇閲嶅鐨勫瓧娈� ID 闂
+ * 褰撳鍒剁粍浠舵椂锛岃嚜鍔ㄤ负鏂扮粍浠剁敓鎴愭柊鐨勫瓧娈� ID
+ *
+ * 瀵瑰簲 issue锛歨ttps://gitee.com/yudaocode/yudao-ui-admin-vue3/issues/ICM22X
+ */
+ const fixDuplicateFields = () => {
+ // 鑾峰彇褰撳墠鎵�鏈夎鍒�
+ const rules = designer.value?.getRule() || []
+ const fieldIds = new Set<string>()
+ let hasChanges = false
+
+ // 閬嶅巻鎵�鏈夎鍒欙紝妫�娴嬪苟淇閲嶅鐨勫瓧娈� ID
+ rules.forEach((rule: any) => {
+ if (rule.field) {
+ if (fieldIds.has(rule.field)) {
+ // 鍙戠幇閲嶅锛岀敓鎴愭柊鐨処D
+ const oldField = rule.field
+ const newField = generateUUID()
+ console.log(`[FormCreate] 妫�娴嬪埌閲嶅瀛楁ID: ${oldField}, 宸茶嚜鍔ㄦ洿鏂颁负: ${newField}`)
+ rule.field = newField
+ hasChanges = true
+ } else {
+ fieldIds.add(rule.field)
+ }
+ }
+ })
+
+ // 濡傛灉鏈夐噸澶嶅瓧娈佃淇锛屾洿鏂拌璁″櫒
+ if (hasChanges) {
+ designer.value?.setRule(rules)
+ }
+
+ return hasChanges
+ }
+
+ onMounted(async () => {
+ await nextTick()
+ buildFormComponents()
+ buildSystemMenu()
+
+ // 鐩戝惉璁捐鍣ㄥ唴瀹瑰彉鍖栵紝鑷姩淇閲嶅瀛楁ID
+ let isFixing = false // 闃叉鏃犻檺寰幆
+ watch(
+ () => designer.value?.getRule(),
+ async () => {
+ if (!isFixing) {
+ isFixing = true
+ await nextTick()
+ fixDuplicateFields()
+ isFixing = false
+ }
+ },
+ { deep: true }
+ )
+ })
+}
--
Gitblit v1.8.0