diff --git a/WebSite/package-lock.json b/WebSite/package-lock.json
index e6ed59efa39c597e6bbc919582e4ad49e3d1b950..b8e2f8ecbdda529689f7d386987874d1e2ff7888 100644
--- a/WebSite/package-lock.json
+++ b/WebSite/package-lock.json
@@ -1857,6 +1857,16 @@
           "integrity": "sha1-/q7SVZc9LndVW4PbwIhRpsY1IPo=",
           "dev": true
         },
+        "ansi-styles": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
+          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "color-convert": "^2.0.1"
+          }
+        },
         "big.js": {
           "version": "3.2.0",
           "resolved": "https://registry.npm.taobao.org/big.js/download/big.js-3.2.0.tgz",
@@ -1889,12 +1899,47 @@
             "unique-filename": "^1.1.1"
           }
         },
+        "chalk": {
+          "version": "4.1.2",
+          "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
+          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true,
+          "optional": true
+        },
         "emojis-list": {
           "version": "2.1.0",
           "resolved": "https://registry.npm.taobao.org/emojis-list/download/emojis-list-2.1.0.tgz",
           "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=",
           "dev": true
         },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true,
+          "optional": true
+        },
         "html-webpack-plugin": {
           "version": "3.2.0",
           "resolved": "https://registry.npm.taobao.org/html-webpack-plugin/download/html-webpack-plugin-3.2.0.tgz?cache=0&sync_timestamp=1613744691795&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhtml-webpack-plugin%2Fdownload%2Fhtml-webpack-plugin-3.2.0.tgz",
@@ -1944,6 +1989,16 @@
             "minipass": "^3.1.1"
           }
         },
+        "supports-color": {
+          "version": "7.2.0",
+          "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
+          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        },
         "terser-webpack-plugin": {
           "version": "2.3.8",
           "resolved": "https://registry.npm.taobao.org/terser-webpack-plugin/download/terser-webpack-plugin-2.3.8.tgz?cache=0&sync_timestamp=1603881839307&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fterser-webpack-plugin%2Fdownload%2Fterser-webpack-plugin-2.3.8.tgz",
@@ -1970,6 +2025,53 @@
             "define-properties": "^1.1.2",
             "object.getownpropertydescriptors": "^2.0.3"
           }
+        },
+        "vue-loader-v16": {
+          "version": "npm:vue-loader@16.8.3",
+          "resolved": "https://registry.npmmirror.com/vue-loader/-/vue-loader-16.8.3.tgz",
+          "integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "chalk": "^4.1.0",
+            "hash-sum": "^2.0.0",
+            "loader-utils": "^2.0.0"
+          },
+          "dependencies": {
+            "big.js": {
+              "version": "5.2.2",
+              "resolved": "https://registry.npmmirror.com/big.js/-/big.js-5.2.2.tgz",
+              "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
+              "dev": true,
+              "optional": true
+            },
+            "emojis-list": {
+              "version": "3.0.0",
+              "resolved": "https://registry.npmmirror.com/emojis-list/-/emojis-list-3.0.0.tgz",
+              "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
+              "dev": true,
+              "optional": true
+            },
+            "json5": {
+              "version": "2.2.3",
+              "resolved": "https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz",
+              "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+              "dev": true,
+              "optional": true
+            },
+            "loader-utils": {
+              "version": "2.0.4",
+              "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-2.0.4.tgz",
+              "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "big.js": "^5.2.2",
+                "emojis-list": "^3.0.0",
+                "json5": "^2.1.2"
+              }
+            }
+          }
         }
       }
     },
@@ -5955,11 +6057,6 @@
       "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
       "dev": true
     },
-    "faker": {
-      "version": "5.5.3",
-      "resolved": "https://registry.npmmirror.com/faker/-/faker-5.5.3.tgz",
-      "integrity": "sha512-wLTv2a28wjUyWkbnX7u/ABZBkUkIF2fCd73V6P2oFqEGEktDfzWx4UxrSqtPRw0xPRAcjeAOIiJWqZm3pP4u3g=="
-    },
     "fast-deep-equal": {
       "version": "3.1.3",
       "resolved": "https://registry.npm.taobao.org/fast-deep-equal/download/fast-deep-equal-3.1.3.tgz?cache=0&sync_timestamp=1591599651635&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffast-deep-equal%2Fdownload%2Ffast-deep-equal-3.1.3.tgz",
@@ -13429,87 +13526,6 @@
         }
       }
     },
-    "vue-loader-v16": {
-      "version": "npm:vue-loader@16.8.3",
-      "resolved": "https://registry.npmmirror.com/vue-loader/-/vue-loader-16.8.3.tgz",
-      "integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "chalk": "^4.1.0",
-        "hash-sum": "^2.0.0",
-        "loader-utils": "^2.0.0"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "chalk": {
-          "version": "4.1.2",
-          "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
-          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true,
-          "optional": true
-        },
-        "has-flag": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
-          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-          "dev": true,
-          "optional": true
-        },
-        "loader-utils": {
-          "version": "2.0.4",
-          "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-2.0.4.tgz",
-          "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "big.js": "^5.2.2",
-            "emojis-list": "^3.0.0",
-            "json5": "^2.1.2"
-          }
-        },
-        "supports-color": {
-          "version": "7.2.0",
-          "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
-          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "has-flag": "^4.0.0"
-          }
-        }
-      }
-    },
     "vue-particles": {
       "version": "1.0.9",
       "resolved": "https://registry.npm.taobao.org/vue-particles/download/vue-particles-1.0.9.tgz",
diff --git a/WebSite/src/api/sourceApi.js b/WebSite/src/api/sourceApi.js
new file mode 100644
index 0000000000000000000000000000000000000000..ecd6bb9c12fe7e8846f37aeb0dbd7ef242538f8b
--- /dev/null
+++ b/WebSite/src/api/sourceApi.js
@@ -0,0 +1,30 @@
+/*
+ * @Description:
+ * @Autor: dongjunhua
+ * @Date: 2021-01-28 15:54:35
+ * @LastEditors: dongjunhua
+ * @LastEditTime: 2021-01-28 16:00:16
+ */
+
+import request from '@/core/base/request';
+
+class SourceApi {
+   //1.鏌ヨ鍑烘墍鏈夌殑鏁版嵁婧�
+  static dataSourceList() {
+    return request.post('/dataSource/pc/v1/dataSourceList');
+  }
+  //2.鏍规嵁鏁版嵁婧愬悕绉拌幏鍙栭泦鍚�
+  static listByDataSourceName(data) {
+    return request.post('/datamodel/pc/v1/listByDataSourceName',data);
+  }
+  //3.鏍规嵁鏁版嵁婧愬悕绉版煡璇㈡暟鎹�
+  static getEntityByName(data) {
+    return request.post(`/dataSource/pc/v1/getEntityByName?name=${data}`);
+  }
+  //4.娴嬭瘯杩炴帴
+  static testDataConfigurationIsOk(data) {
+    return request.post(`/dataSource/pc/v1/testDataConfigurationIsOk?name=${data}`);
+  }
+}
+
+export default SourceApi;
diff --git a/WebSite/src/main.js b/WebSite/src/main.js
index ca0ddb317af1f9ce32c391daba6d93b849151d31..15e0a47ba651992581299013342a22fce5ba96c6 100644
--- a/WebSite/src/main.js
+++ b/WebSite/src/main.js
@@ -38,8 +38,14 @@ import VueParticles from 'vue-particles';
     mockXHR();
   }
 })();
+//娉ㄥ唽鎵€鏈夊浘鏍�
+import * as ElementPlusIconsVue from '@element-plus/icons-vue'
+
 
 const app = createApp(App);
+for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
+  app.component(key, component)
+}
 
 // register plugins
 app
diff --git a/WebSite/src/views/configure-data-sources/index.vue b/WebSite/src/views/configure-data-sources/index.vue
index 37a695c1fd039ff734f737dedb0915a66a7f3675..8c30ae86635320d0fe0ee727e206e8f4c99550ca 100644
--- a/WebSite/src/views/configure-data-sources/index.vue
+++ b/WebSite/src/views/configure-data-sources/index.vue
@@ -1,108 +1,177 @@
 <template>
   <div class="container">
-    <div class="left">
-      <el-card style="height: 100%">
-        <el-table
-          :data="tableDateSource"
-          style="width: 100%"
-          :header-cell-style="{
-            backgroundColor: '#E8EEF4',
-            height: '60px',
-            fontSize: '16px',
-          }"
-          :cell-style="{ height: '60px', fontSize: '16px' }"
-          stripe
-          border
-          max-height="840px"
-        >
-          <el-table-column label="鏁版嵁婧愬悕绉�" prop="name" align="center">
-          </el-table-column>
-        </el-table>
-      </el-card>
-    </div>
-    <div class="right">
-      <el-card style="height: 100%">
-        <div class="top">
-          <div class="title">褰撳墠閫変腑鏁版嵁婧愬悕绉帮細{{ formDate.sourceName }}</div>
-          <div class="topBtn">
-            <el-button type="success">淇濆瓨</el-button>
-            <el-button type="primary">娴嬭瘯杩炴帴</el-button>
-          </div>
+    <el-row :gutter="20" style="height: 100%">
+      <el-col :span="6">
+        <div class="left">
+          <el-card style="height: 100%">
+            <el-table
+              :data="tableDateSource"
+              style="width: 100%"
+              :header-cell-style="{
+                backgroundColor: '#E8EEF4',
+                height: '60px',
+                fontSize: '16px',
+              }"
+              :cell-style="{ height: '60px', fontSize: '16px' }"
+              stripe
+              border
+              max-height="840px"
+              @row-click="handleClick"
+            >
+              <el-table-column label="鏁版嵁婧愬悕绉�" prop="name" align="center">
+              </el-table-column>
+              <el-table-column
+                align="center"
+                width="80"
+                :render-header="renderHeader"
+              >
+                <template #default="scope">
+                  <el-button
+                    type="danger"
+                    circle
+                    @click="handleDeleteSource(scope.row)"
+                  >
+                    <el-icon><Delete /></el-icon>
+                  </el-button>
+                </template>
+              </el-table-column>
+            </el-table>
+          </el-card>
         </div>
-        <el-form v-model="formDate" label-width="110px" label-position="left">
-          <el-form-item label="鏁版嵁搴撻摼鎺ワ細" prop="url">
-            <el-input v-model="formDate.url" placeholder="璇疯緭鍏ユ暟鎹簱閾炬帴" />
-          </el-form-item>
-          <el-form-item label="鏁版嵁搴撳悕绉帮細" prop="name">
-            <el-input v-model="formDate.name" placeholder="璇疯緭鍏ユ暟鎹簱鍚嶇О" />
-          </el-form-item>
-          <el-form-item label="鏁版嵁搴撹处鍙凤細" prop="count">
-            <el-input v-model="formDate.count" placeholder="璇疯緭鍏ユ暟鎹簱璐﹀彿" />
-          </el-form-item>
-          <el-form-item label="鏁版嵁搴撳瘑鐮侊細" prop="password">
-            <el-input
-              v-model="formDate.password"
-              placeholder="璇疯緭鍏ユ暟鎹簱瀵嗙爜"
-            />
-          </el-form-item>
-          <el-form-item label="鏁版嵁鎶藉彇璇彞锛�" prop="statement">
-            <el-input
-              v-model="formDate.statement"
-              placeholder="璇疯緭鍏ユ暟鎹娊鍙栬鍙�"
-            />
-          </el-form-item>
-        </el-form>
-        <el-table
-          :data="tableDataDetail"
-          style="width: 100%; margin-top: 10px"
-          border
-          :header-cell-style="{
-            backgroundColor: '#E8EEF4',
-            height: '50px',
-            fontSize: '15px',
-          }"
-          :cell-style="{ height: '40px', fontSize: '14px' }"
-        >
-          <el-table-column
-            label="瀛楁"
-            prop="a"
-            align="center"
-          ></el-table-column>
-          <el-table-column
-            label="瀛楁鍚嶇О"
-            prop="b"
-            align="center"
-          ></el-table-column>
-          <el-table-column
-            label="澶栭儴瀵瑰簲瀛楁"
-            prop="c"
-            align="center"
-          ></el-table-column>
-          <el-table-column label="鍙互涓虹┖鍊�" prop="d" align="center">
-            <template #default="scope">
-              <el-switch v-model="scope.row.d" />
-            </template>
-          </el-table-column>
-          <el-table-column label="璁剧疆鍞竴鍊�" prop="e" align="center">
-            <template #default="scope">
-              <el-switch v-model="scope.row.e" />
-            </template>
-          </el-table-column>
-        </el-table>
-        <div style="text-align: center">
-          <Pagination
-            :total="total"
-            @pagination="handlePageChange"
-            :page="query.pageNo"
-            :limit="query.pageSize"
-          ></Pagination>
+      </el-col>
+      <el-col :span="18">
+        <div class="right">
+          <el-card style="height: 100%">
+            <div class="top">
+              <div class="title">褰撳墠閫変腑鏁版嵁婧愬悕绉帮細{{ formDate.name }}</div>
+              <div class="topBtn">
+                <el-button type="primary">瀵煎叆</el-button>
+                <el-button type="primary">瀵煎嚭</el-button>
+                <el-button type="success">淇濆瓨</el-button>
+                <el-button type="primary" @click="testDataConfigurationIsOk()"
+                  >娴嬭瘯杩炴帴</el-button
+                >
+              </div>
+            </div>
+            <el-form
+              v-model="formDate"
+              label-width="110px"
+              label-position="left"
+            >
+              <el-form-item label="鏁版嵁搴撻摼鎺ワ細" prop="sqlConnect">
+                <el-input
+                  v-model="formDate.sqlConnect"
+                  placeholder="璇疯緭鍏ユ暟鎹簱閾炬帴"
+                />
+              </el-form-item>
+              <el-form-item label="鏁版嵁搴撳悕绉帮細" prop="sqlDbName">
+                <el-input
+                  v-model="formDate.sqlDbName"
+                  placeholder="璇疯緭鍏ユ暟鎹簱鍚嶇О"
+                />
+              </el-form-item>
+              <el-form-item label="鏁版嵁搴撹处鍙凤細" prop="sqlAccountUserName">
+                <el-input
+                  v-model="formDate.sqlAccountUserName"
+                  placeholder="璇疯緭鍏ユ暟鎹簱璐﹀彿"
+                />
+              </el-form-item>
+              <el-form-item label="鏁版嵁搴撳瘑鐮侊細" prop="sqlAccountPwd">
+                <el-input
+                  v-model="formDate.sqlAccountPwd"
+                  placeholder="璇疯緭鍏ユ暟鎹簱瀵嗙爜"
+                />
+              </el-form-item>
+              <el-form-item label="鏁版嵁鎶藉彇璇彞锛�" prop="sqlStr">
+                <el-input
+                  v-model="formDate.sqlStr"
+                  placeholder="璇疯緭鍏ユ暟鎹娊鍙栬鍙�"
+                />
+              </el-form-item>
+            </el-form>
+            <el-table
+              :data="tableDataDetail"
+              style="width: 100%; margin-top: 10px"
+              border
+              :header-cell-style="{
+                backgroundColor: '#E8EEF4',
+                height: '50px',
+                fontSize: '15px',
+              }"
+              :cell-style="{ height: '40px', fontSize: '14px' }"
+              max-height="570px"
+            >
+              <el-table-column label="瀛楁" prop="a" align="center">
+                <template #default="scope">
+                  <div v-if="!scope.row.isChange">{{ scope.row.a }}</div>
+                  <el-input
+                    v-model="scope.row.a"
+                    v-if="scope.row.isChange"
+                  ></el-input>
+                </template>
+              </el-table-column>
+              <el-table-column label="瀛楁鍚嶇О" prop="b" align="center">
+                <template #default="scope">
+                  <div v-if="!scope.row.isChange">{{ scope.row.b }}</div>
+                  <el-input
+                    v-model="scope.row.b"
+                    v-if="scope.row.isChange"
+                  ></el-input>
+                </template>
+              </el-table-column>
+              <el-table-column label="澶栭儴瀵瑰簲瀛楁" prop="c" align="center">
+                <template #default="scope">
+                  <div v-if="!scope.row.isChange">{{ scope.row.c }}</div>
+                  <el-input
+                    v-model="scope.row.c"
+                    v-if="scope.row.isChange"
+                  ></el-input>
+                </template>
+              </el-table-column>
+              <el-table-column label="鍙互涓虹┖鍊�" prop="d" align="center">
+                <template #default="scope">
+                  <el-switch v-model="scope.row.d" />
+                </template>
+              </el-table-column>
+              <el-table-column label="璁剧疆鍏宠仈鍊�" prop="e" align="center">
+                <template #default="scope">
+                  <el-switch v-model="scope.row.e" />
+                </template>
+              </el-table-column>
+              <el-table-column
+                label="鎿嶄綔"
+                align="center"
+                :render-header="renderHeaderTable"
+              >
+                <template #default="scope">
+                  <el-button
+                    v-if="!scope.row.isChange"
+                    type="primary"
+                    @click="handleEdit(scope.row)"
+                    >缂栬緫</el-button
+                  >
+                  <el-button
+                    v-if="scope.row.isChange"
+                    type="primary"
+                    @click="handleOver(scope.row)"
+                    >瀹屾垚</el-button
+                  >
+                  <el-button type="danger" @click="handleDelete(scope.row)"
+                    >鍒犻櫎</el-button
+                  >
+                </template>
+              </el-table-column>
+            </el-table>
+          </el-card>
         </div>
-      </el-card>
-    </div>
+      </el-col>
+    </el-row>
   </div>
 </template> 
 <script>
 import { toRefs, reactive, onMounted } from 'vue';
+import SourceApi from '@/api/sourceApi.js';
+import { ElMessage } from 'element-plus';
 export default {
   setup() {
     const data = reactive({
@@ -157,12 +226,12 @@ export default {
         },
       ],
       formDate: {
-        sourceName: '',
-        url: '',
         name: '',
-        count: '',
-        password: '',
-        statement: '',
+        sqlConnect: '',
+        sqlDbName: '',
+        sqlAccountUserName: '',
+        sqlAccountPwd: '',
+        sqlStr: '',
       },
       tableDataDetail: [
         {
@@ -171,6 +240,7 @@ export default {
           c: 'DM-1',
           d: false,
           e: true,
+          isChange: false,
         },
         {
           a: 'MC',
@@ -178,6 +248,7 @@ export default {
           c: 'MC-1',
           d: true,
           e: true,
+          isChange: false,
         },
         {
           a: 'CJRQ',
@@ -185,6 +256,7 @@ export default {
           c: 'CJRQ-1',
           d: true,
           e: false,
+          isChange: false,
         },
         {
           a: 'ZZRQ',
@@ -192,6 +264,7 @@ export default {
           c: 'ZZRQ-1',
           d: false,
           e: false,
+          isChange: false,
         },
         {
           a: 'LS',
@@ -199,6 +272,7 @@ export default {
           c: 'LS-1',
           d: true,
           e: true,
+          isChange: false,
         },
         {
           a: 'CC',
@@ -206,6 +280,7 @@ export default {
           c: 'DM-1',
           d: false,
           e: true,
+          isChange: false,
         },
         {
           a: 'BB',
@@ -213,6 +288,7 @@ export default {
           c: 'BB-1',
           d: false,
           e: true,
+          isChange: false,
         },
         {
           a: 'DM',
@@ -220,6 +296,7 @@ export default {
           c: 'DM-1',
           d: false,
           e: true,
+          isChange: false,
         },
         {
           a: 'MC',
@@ -227,6 +304,7 @@ export default {
           c: 'MC-1',
           d: true,
           e: true,
+          isChange: false,
         },
         {
           a: 'CJRQ',
@@ -234,6 +312,7 @@ export default {
           c: 'CJRQ-1',
           d: true,
           e: false,
+          isChange: false,
         },
         {
           a: 'ZZRQ',
@@ -241,6 +320,95 @@ export default {
           c: 'ZZRQ-1',
           d: false,
           e: false,
+          isChange: false,
+        },
+        {
+          a: 'DM',
+          b: '閮ㄩ棬缂栧彿',
+          c: 'DM-1',
+          d: false,
+          e: true,
+          isChange: false,
+        },
+        {
+          a: 'MC',
+          b: '閮ㄩ棬鍚嶇О',
+          c: 'MC-1',
+          d: true,
+          e: true,
+          isChange: false,
+        },
+        {
+          a: 'CJRQ',
+          b: '鍒涘缓鏃ユ湡',
+          c: 'CJRQ-1',
+          d: true,
+          e: false,
+          isChange: false,
+        },
+        {
+          a: 'ZZRQ',
+          b: '缁堟鏃ユ湡',
+          c: 'ZZRQ-1',
+          d: false,
+          e: false,
+          isChange: false,
+        },
+        {
+          a: 'LS',
+          b: '闅跺睘',
+          c: 'LS-1',
+          d: true,
+          e: true,
+          isChange: false,
+        },
+        {
+          a: 'CC',
+          b: '灞傛',
+          c: 'DM-1',
+          d: false,
+          e: true,
+          isChange: false,
+        },
+        {
+          a: 'BB',
+          b: '鎶ヨ〃',
+          c: 'BB-1',
+          d: false,
+          e: true,
+          isChange: false,
+        },
+        {
+          a: 'DM',
+          b: '閮ㄩ棬缂栧彿',
+          c: 'DM-1',
+          d: false,
+          e: true,
+          isChange: false,
+        },
+        {
+          a: 'MC',
+          b: '閮ㄩ棬鍚嶇О',
+          c: 'MC-1',
+          d: true,
+          e: true,
+          isChange: false,
+        },
+        {
+          a: 'CJRQ',
+          b: '鍒涘缓鏃ユ湡',
+          c: 'CJRQ-1',
+          d: true,
+          e: false,
+          isChange: false,
+        },
+        {
+          a: 'ZZRQ',
+          b: '缁堟鏃ユ湡',
+          c: 'ZZRQ-1',
+          d: false,
+          e: false,
+          isChange: false,
         },
       ],
       total: 100,
@@ -253,16 +421,104 @@ export default {
       getTableDate();
     });
     //鑾峰彇琛ㄦ牸鏁版嵁
-    const getTableDate = () => {};
+    const getTableDate = () => {
+      SourceApi.dataSourceList().then((res) => {
+        data.tableDateSource = res.data;
+        data.formDate = data.tableDateSource[0];
+        listByDataSourceName();
+      });
+    };
+    //鑾峰彇瀛楁
+    const listByDataSourceName = () => {
+      SourceApi.listByDataSourceName({
+        dataSourceName: data.formDate.name,
+      }).then((res) => {
+        data.tableDataDetail = res.data;
+      });
+    };
+    //鐐瑰嚮姣忎竴琛�
+    const handleClick = (row) => {
+      SourceApi.getEntityByName(row.name).then((res) => {
+        data.formDate = res.data[0];
+        listByDataSourceName();
+      });
+    };
     //鍒嗛〉
     const handlePageChange = (v) => {
       data.query.pageNo = v.page;
       data.query.pageSize = v.limit;
-      getTableDate();
+      listByDataSourceName();
+    };
+    //澧炲姞鏁版嵁婧�
+    const add = (v) => {
+      if (v == 1) {
+        data.tableDateSource.push({
+          name: '',
+        });
+      } else {
+        data.tableDataDetail.push({
+          a: '',
+          b: '',
+          c: '',
+          d: false,
+          e: false,
+          isChange: true,
+        });
+      }
+    };
+    //鍒犻櫎鏁版嵁婧�
+    const handleDeleteSource = () => {};
+    //鏂板鏁版嵁婧�
+    const renderHeader = () => {
+      return (
+        <div>
+          <el-icon onClick={() => add(1)} style="font-size: 30px;">
+            <CirclePlus />
+          </el-icon>
+        </div>
+      );
+    };
+    //鏂板瀛楁
+    const renderHeaderTable = () => {
+      return (
+        <div>
+          <span>鎿嶄綔</span>
+          <el-icon onClick={() => add(2)} style="margin-left:8px">
+            <CirclePlus />
+          </el-icon>
+        </div>
+      );
+    };
+    const handleDelete = () => {};
+    const handleEdit = (row) => {
+      row.isChange = true;
+    };
+    const handleOver = (row) => {
+      row.isChange = false;
+    };
+    //娴嬭瘯杩炴帴
+    const testDataConfigurationIsOk = () => {
+      SourceApi.testDataConfigurationIsOk(data.formDate.name).then(() => {
+        ElMessage({
+          message: '娴嬭瘯杩炴帴鎴愬姛',
+          type: 'success',
+        });
+      });
     };
     return {
       ...toRefs(data),
+      getTableDate,
+      listByDataSourceName,
+      handleClick,
+      handleDeleteSource,
+      handleDelete,
+      handleEdit,
+      handleOver,
       handlePageChange,
+      renderHeader,
+      renderHeaderTable,
+      add,
+      testDataConfigurationIsOk,
     };
   },
 };
@@ -271,15 +527,11 @@ export default {
 .container {
   height: 100vh;
   padding: 20px;
-  display: flex;
   .left {
     height: 100%;
-    flex: 1;
-    margin-right: 20px;
   }
   .right {
     height: 100%;
-    flex: 3;
     .top {
       line-height: 28px;
       height: 28px;
diff --git a/WebSite/src/views/create-database/index.vue b/WebSite/src/views/create-database/index.vue
index b131d28fb2fe5f2fb306d8f6d4a27d6282436af1..3e80b33881cd3dea2874cf6de851633de5e4707a 100644
--- a/WebSite/src/views/create-database/index.vue
+++ b/WebSite/src/views/create-database/index.vue
@@ -95,10 +95,21 @@
             </el-table-column>
             <el-table-column label="鎿嶄綔" align="center" width="350">
               <template #default="scope">
-                <el-button type="warning" @click="handleEdit(scope.row)">
+                <el-button type="primary" @click="handleEdit(scope.row)">
                   缂栬緫
                 </el-button>
-                <el-button type="success" @click="handleDo(scope.row)">
+                <el-button
+                  v-if="scope.row.state === '鍏抽棴'"
+                  type="primary"
+                  @click="handleDo(scope.row)"
+                >
+                  鏌ョ湅鏁版嵁
+                </el-button>
+                <el-button
+                  v-if="scope.row.state === '姝e父'"
+                  type="primary"
+                  @click="handleDo(scope.row)"
+                >
                   鍒朵綔琛�
                 </el-button>
                 <el-button type="danger" @click="handleDelete(scope.row)">
diff --git a/WebSite/vue.config.js b/WebSite/vue.config.js
index 77af601ff720cc2e77228853122e5b432c707a9a..97fcb17882ad2ae5c6a073b07479650e260cc4ba 100644
--- a/WebSite/vue.config.js
+++ b/WebSite/vue.config.js
@@ -30,7 +30,8 @@ if (process.env.NODE_ENV === 'mock') {
   devServer.proxy = {
     // detail: https://cli.vuejs.org/config/#devserver-proxy
     [process.env.VUE_APP_BASE_API]: {
-      target: 'http://localhost:8001',
+      // target: 'http://localhost:8001', 
+      target: 'http://192.168.2.22:8858/',
       changeOrigin: true,
       pathRewrite: {
         ['^' + process.env.VUE_APP_BASE_API]: ''