From 19b7cd28101017c8c46c3ee99397e12ab081b911 Mon Sep 17 00:00:00 2001
From: ximu-tao <me_litao@outlook.com>
Date: Mon, 17 Feb 2025 23:14:26 +0800
Subject: [PATCH] =?UTF-8?q?feat(CRUD):=E6=94=AF=E6=8C=81=E7=82=B9=E5=87=BB?=
 =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=AD=97=E6=AE=B5=EF=BC=8C=E6=AF=94=E6=8B=96?=
 =?UTF-8?q?=E6=8B=BD=E6=96=B9=E4=BE=BF=E4=B8=80=E7=82=B9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 web/src/views/backend/crud/design.vue | 105 +++++++++++++++-----------
 1 file changed, 61 insertions(+), 44 deletions(-)

diff --git a/web/src/views/backend/crud/design.vue b/web/src/views/backend/crud/design.vue
index 4f9a1e54..ccf8398a 100644
--- a/web/src/views/backend/crud/design.vue
+++ b/web/src/views/backend/crud/design.vue
@@ -155,21 +155,21 @@
                 <el-collapse class="field-collapse" v-model="state.fieldCollapseName">
                     <el-collapse-item :title="t('crud.crud.Common Fields')" name="common">
                         <div class="field-box" :ref="tabsRefs.set">
-                            <div v-for="(field, index) in fieldItem.common" :key="index" class="field-item">
+                            <div v-for="(field, index) in fieldItem.common" :key="index" class="field-item" @click.stop="clickAddSortable(field)">
                                 <span>{{ field.title }}</span>
                             </div>
                         </div>
                     </el-collapse-item>
                     <el-collapse-item :title="t('crud.crud.Base Fields')" name="base">
                         <div class="field-box" :ref="tabsRefs.set">
-                            <div v-for="(field, index) in fieldItem.base" :key="index" class="field-item">
+                            <div v-for="(field, index) in fieldItem.base" :key="index" class="field-item" @click.stop="clickAddSortable(field)">
                                 <span>{{ field.title }}</span>
                             </div>
                         </div>
                     </el-collapse-item>
                     <el-collapse-item :title="t('crud.crud.Advanced Fields')" name="senior">
                         <div class="field-box" :ref="tabsRefs.set">
-                            <div v-for="(field, index) in fieldItem.senior" :key="index" class="field-item">
+                            <div v-for="(field, index) in fieldItem.senior" :key="index" class="field-item" @click.stop="clickAddSortable(field)">
                                 <span>{{ field.title }}</span>
                             </div>
                         </div>
@@ -1381,6 +1381,55 @@ const autoRenameRepeatField = (fieldName: string) => {
     }
 }
 
+const tableFieldAdd = (field?: FieldItem, position?: number) => {
+    const data = handleFieldAttr(cloneDeep(field!))
+
+    // 主键重复检测
+    if (data.primaryKey) {
+        if (primaryKeyRepeatCheck(data)) {
+            // 设置为默认排序字段、快速搜索字段
+            state.table.defaultSortField = data.name
+            state.table.quickSearchField.push(data.name)
+        } else {
+            return false;
+        }
+    }
+
+    // 出现权重字段则以其排序
+    if (data.designType == 'weigh') {
+        state.table.defaultSortField = data.name
+    }
+
+    // name 重复时,自动重命名
+    data.name = autoRenameRepeatField(data.name)
+
+    // 插入字段
+    state.fields.splice(position!, 0, data)
+
+    logTableDesignChange({
+        type: 'add-field',
+        index: position!,
+        newName: data.name,
+        oldName: '',
+        after: position === 0 ? 'FIRST FIELD' : state.fields[position! - 1].name,
+    })
+
+    // 远程下拉参数预填
+    if (['remoteSelect', 'remoteSelects'].includes(data.designType)) {
+        showRemoteSelectPre(position!, true)
+    }
+
+    // 表单表格字段预定义
+    if (!data.formBuildExclude) {
+        state.table.formFields.push(data.name)
+    }
+    if (!data.tableBuildExclude) {
+        state.table.columnFields.push(data.name)
+    }
+
+    return true
+}
+
 onMounted(() => {
     loadData()
     const sortable = Sortable.create(designWindowRef.value, {
@@ -1393,47 +1442,8 @@ onMounted(() => {
             if (field && field[evt.oldIndex!]) {
                 const data = handleFieldAttr(cloneDeep(field[evt.oldIndex!]))
 
-                // 主键重复检测
-                if (data.primaryKey) {
-                    if (primaryKeyRepeatCheck(data)) {
-                        // 设置为默认排序字段、快速搜索字段
-                        state.table.defaultSortField = data.name
-                        state.table.quickSearchField.push(data.name)
-                    } else {
-                        return evt.item.remove()
-                    }
-                }
-
-                // 出现权重字段则以其排序
-                if (data.designType == 'weigh') {
-                    state.table.defaultSortField = data.name
-                }
-
-                // name 重复时,自动重命名
-                data.name = autoRenameRepeatField(data.name)
-
-                // 插入字段
-                state.fields.splice(evt.newIndex!, 0, data)
-
-                logTableDesignChange({
-                    type: 'add-field',
-                    index: evt.newIndex!,
-                    newName: data.name,
-                    oldName: '',
-                    after: evt.newIndex === 0 ? 'FIRST FIELD' : state.fields[evt.newIndex! - 1].name,
-                })
-
-                // 远程下拉参数预填
-                if (['remoteSelect', 'remoteSelects'].includes(data.designType)) {
-                    showRemoteSelectPre(evt.newIndex!, true)
-                }
-
-                // 表单表格字段预定义
-                if (!data.formBuildExclude) {
-                    state.table.formFields.push(data.name)
-                }
-                if (!data.tableBuildExclude) {
-                    state.table.columnFields.push(data.name)
+                if ( !tableFieldAdd(data, evt.newIndex) ){
+                    evt.item.remove()
                 }
             }
             evt.item.remove()
@@ -1482,6 +1492,13 @@ onMounted(() => {
     })
 })
 
+const clickAddSortable = (field: FieldItem) => {
+    if (field) {
+        const data = handleFieldAttr(cloneDeep(field))
+        tableFieldAdd(data, state.fields.length)
+    }
+}
+
 /**
  * 修改表名
  * @param val 新表名