Xiao_123 16 часов назад
Родитель
Сommit
3587b8dc8f

+ 479 - 349
src/router/routes.js

@@ -697,6 +697,49 @@ export default {
           alwaysShow: 0,
           metastr: '{"keepAlive":false,"allowClick":false,"enName":"Data Label","editModules":false,"title":"数据标签","fullScreen":false,"target":false}',
           open: null
+        },
+        {
+          meun: '',
+          code: '',
+          hidden: 0,
+          rootId: 1187,
+          icon: '',
+          remark: '',
+          type: 1,
+          title: '数据来源',
+          local: '',
+          path: '/data-governance/data-source',
+          urls: '',
+          children: [],
+          enName: 'Data Source',
+          id: 1191,
+          redirect: '',
+          level: 0,
+          openPath: '',
+          active: '',
+          label: '数据来源',
+          sort: 15,
+          parentId: 1187,
+          effectiveStatus: true,
+          parentName: '',
+          component: 'dataGovernance/dataSource',
+          meta: {
+            keepAlive: false,
+            allowClick: false,
+            roles: [],
+            enName: 'Data Source',
+            icon: '',
+            editModules: false,
+            title: '数据来源',
+            fullScreen: false,
+            target: false,
+            effectiveStatus: true
+          },
+          name: 'data-source',
+          style: '',
+          alwaysShow: 0,
+          metastr: '{"keepAlive":false,"allowClick":false,"enName":"Data Source","editModules":false,"title":"数据来源","fullScreen":false,"target":false}',
+          open: null
         }
       ],
       enName: 'Data Governance',
@@ -1914,382 +1957,469 @@ export default {
       metastr: '{"allowClick":false,"enName":"production line manage","title":"数据工厂","target":false}',
       open: null
     },
+    // {
+    //   meun: '',
+    //   code: '',
+    //   hidden: 0,
+    //   rootId: 0,
+    //   icon: 'mdi-application-settings-outline',
+    //   remark: '',
+    //   type: 0,
+    //   title: '数据服务',
+    //   local: '',
+    //   path: '/dataService',
+    //   urls: '',
+    //   children: [],
+    //   enName: 'data service',
+    //   id: 972,
+    //   redirect: '',
+    //   level: 1,
+    //   openPath: '',
+    //   active: '',
+    //   label: '数据服务',
+    //   sort: 46,
+    //   parentId: 0,
+    //   effectiveStatus: true,
+    //   parentName: 'dataService',
+    //   component: 'Layout',
+    //   meta: {
+    //     allowClick: false,
+    //     roles: [],
+    //     enName: 'data service',
+    //     icon: 'mdi-factory',
+    //     title: '数据服务',
+    //     target: false,
+    //     effectiveStatus: true
+    //   },
+    //   name: 'dataService',
+    //   style: '',
+    //   alwaysShow: 0,
+    //   metastr: '{"allowClick":false,"enName":"data service","title":"数据服务","target":false}'
+    // },
     {
-      meun: '',
-      code: '',
       hidden: 0,
       rootId: 0,
       icon: 'mdi-widgets-outline',
-      remark: '',
       type: 0,
-      title: '数据来源',
-      local: '',
-      path: '/data-origin',
-      urls: '',
+      path: '/dataDeduplication',
       children: [
-
         {
-          meun: '',
-          code: '',
-          hidden: 0,
-          rootId: 1319,
-          icon: 'mdi-widgets-outline',
-          remark: '',
+          hidden: 1,
+          icon: '',
           type: 1,
-          title: 'RDBMS数据源',
-          local: '',
-          path: '/data-origin/rdbms',
-          urls: '',
+          title: '数据去重',
+          path: '/dataDeduplication',
           children: [],
-          enName: 'RDBMS Data Source',
-          id: 1328,
+          enName: 'data Deduplication',
           redirect: '',
-          level: 2,
-          openPath: '',
           active: '',
-          label: 'RDBMS数据源',
-          sort: 1,
-          parentId: 1319,
-          effectiveStatus: true,
-          parentName: '',
-          component: 'dataOrigin/rdbmsDataSource',
-          meta: {
-            keepAlive: false,
-            allowClick: false,
-            roles: [],
-            enName: 'RDBMS Data Source',
-            icon: 'mdi-widgets-outline',
-            editModules: false,
-            title: 'RDBMS数据源',
-            fullScreen: false,
-            target: false,
-            dataPermission: false,
-            effectiveStatus: true
-          },
-          name: 'data-origin',
-          style: '',
-          alwaysShow: 0,
-          metastr: '{"keepAlive":false,"allowClick":false,"enName":"RDBMS Data Source","editModules":false,"title":"RDBMS数据源","fullScreen":false,"target":false,"dataPermission":false}',
-          open: null
-        },
-        {
-          meun: '',
-          code: '',
-          hidden: 0,
-          rootId: 1319,
-          icon: 'mdi-widgets-outline',
-          remark: '',
-          type: 1,
-          title: '非结构化数据源',
-          local: '',
-          path: '/data-origin/unstructured',
-          urls: '',
-          children: [
-            {
-              meun: '',
-              code: '',
-              hidden: 0,
-              rootId: 1319,
-              icon: 'mdi-account-plus-outline',
-              remark: '',
-              type: 1,
-              title: '手动收集',
-              local: '',
-              path: '/data-origin/unstructured/manual-collection',
-              urls: '',
-              children: [],
-              enName: 'Manual collection',
-              id: 1320,
-              redirect: '',
-              level: 3,
-              openPath: '',
-              active: '',
-              label: '手动收集',
-              sort: 1,
-              parentId: 1327,
-              effectiveStatus: true,
-              parentName: '',
-              component: 'dataOrigin/unstructuredData/manualCollection',
-              meta: {
-                keepAlive: false,
-                allowClick: false,
-                roles: [
-                  {
-                    active: '1',
-                    alwaysShow: 0,
-                    children: [],
-                    code: '',
-                    component: '',
-                    effectiveStatus: true,
-                    enName: 'Excel Import',
-                    hidden: 0,
-                    icon: '',
-                    id: 1321,
-                    label: 'Excel导入',
-                    level: 3,
-                    local: '',
-                    meta: null,
-                    metastr: '{"enName":"Excel Import","title":"Excel导入","target":false}',
-                    meun: '',
-                    name: 'excelImport',
-                    open: 0,
-                    openPath: '',
-                    parentId: 1320,
-                    parentName: '',
-                    path: '',
-                    redirect: '',
-                    remark: '',
-                    rootId: 1319,
-                    sort: 0,
-                    style: '',
-                    type: 3,
-                    urls: ''
-                  },
-                  {
-                    active: '1',
-                    alwaysShow: 0,
-                    children: [],
-                    code: '',
-                    component: '',
-                    effectiveStatus: true,
-                    enName: 'Image Import',
-                    hidden: 0,
-                    icon: '',
-                    id: 1322,
-                    label: '名片解析',
-                    level: 3,
-                    local: '',
-                    meta: null,
-                    metastr: '{"enName":"Image Import","title":"名片解析","target":false}',
-                    meun: '',
-                    name: 'imageImport',
-                    open: 0,
-                    openPath: '',
-                    parentId: 1320,
-                    parentName: '',
-                    path: '',
-                    redirect: '',
-                    remark: '',
-                    rootId: 1319,
-                    sort: 5,
-                    style: '',
-                    type: 3,
-                    urls: ''
-                  },
-                  {
-                    active: '1',
-                    alwaysShow: 0,
-                    children: [],
-                    code: '',
-                    component: '',
-                    effectiveStatus: true,
-                    enName: 'Manual Import',
-                    hidden: 0,
-                    icon: '',
-                    id: 1323,
-                    label: '手动输入',
-                    level: 3,
-                    local: '',
-                    meta: null,
-                    metastr: '{"enName":"Manual Import","title":"手动输入","target":false}',
-                    meun: '',
-                    name: 'manualImport',
-                    open: 0,
-                    openPath: '',
-                    parentId: 1320,
-                    parentName: '',
-                    path: '',
-                    redirect: '',
-                    remark: '',
-                    rootId: 1319,
-                    sort: 10,
-                    style: '',
-                    type: 3,
-                    urls: ''
-                  }
-                ],
-                enName: 'Manual collection',
-                icon: 'mdi-account-plus-outline',
-                editModules: false,
-                title: '手动收集',
-                fullScreen: false,
-                target: false,
-                dataPermission: false,
-                effectiveStatus: true
-              },
-              name: 'manual-collection',
-              style: '',
-              alwaysShow: 0,
-              metastr: '{"keepAlive":false,"allowClick":false,"enName":"Manual collection","editModules":false,"title":"手动收集","fullScreen":false,"target":false,"dataPermission":false}',
-              open: null
-            },
-            {
-              meun: '',
-              code: '',
-              hidden: 0,
-              rootId: 1319,
-              icon: 'mdi-bug',
-              remark: '',
-              type: 1,
-              title: '自动收集',
-              local: '',
-              path: '/data-origin/unstructured/auto-collection',
-              urls: '',
-              children: [],
-              enName: 'Auto collection',
-              id: 1324,
-              redirect: '',
-              level: 3,
-              openPath: '',
-              active: '',
-              label: '自动收集',
-              sort: 1,
-              parentId: 1327,
-              effectiveStatus: true,
-              parentName: '',
-              component: 'dataOrigin/unstructuredData/autoCollection',
-              meta: {
-                keepAlive: false,
-                allowClick: false,
-                roles: [
-                  {
-                    active: '1',
-                    alwaysShow: 0,
-                    children: [],
-                    code: '',
-                    component: '',
-                    effectiveStatus: true,
-                    enName: 'Spider Management',
-                    hidden: 0,
-                    icon: 'mdi-bug',
-                    id: 1325,
-                    label: '爬虫管理',
-                    level: 3,
-                    local: '',
-                    meta: null,
-                    metastr: '{"enName":"Spider Management","title":"爬虫管理","target":false}',
-                    meun: '',
-                    name: 'spiderManagement',
-                    open: 0,
-                    openPath: '',
-                    parentId: 1324,
-                    parentName: '',
-                    path: '',
-                    redirect: '',
-                    remark: '',
-                    rootId: 1319,
-                    sort: 1,
-                    style: '',
-                    type: 3,
-                    urls: ''
-                  },
-                  {
-                    active: '1',
-                    alwaysShow: 0,
-                    children: [],
-                    code: '',
-                    component: '',
-                    effectiveStatus: true,
-                    enName: 'Page Parsing',
-                    hidden: 0,
-                    icon: 'mdi-bug',
-                    id: 1326,
-                    label: '网页解析',
-                    level: 3,
-                    local: '',
-                    meta: null,
-                    metastr: '{"enName":"Page Parsing","title":"网页解析","target":false}',
-                    meun: '',
-                    name: 'pageParsing',
-                    open: 0,
-                    openPath: '',
-                    parentId: 1324,
-                    parentName: '',
-                    path: '',
-                    redirect: '',
-                    remark: '',
-                    rootId: 1319,
-                    sort: 1,
-                    style: '',
-                    type: 3,
-                    urls: ''
-                  }
-                ],
-                enName: 'Auto collection',
-                icon: 'mdi-bug',
-                editModules: false,
-                title: '自动收集',
-                fullScreen: false,
-                target: false,
-                dataPermission: false,
-                effectiveStatus: true
-              },
-              name: 'auto-collection',
-              style: '',
-              alwaysShow: 0,
-              metastr: '{"keepAlive":false,"allowClick":false,"enName":"Auto collection","editModules":false,"title":"自动收集","fullScreen":false,"target":false,"dataPermission":false}',
-              open: null
-            }
-          ],
-          enName: 'Unstructured Data Source',
-          id: 1327,
-          redirect: '',
-          level: 2,
-          openPath: '',
-          active: '',
-          label: '非结构化数据源',
-          sort: 10,
-          parentId: 1319,
-          effectiveStatus: true,
-          parentName: '',
-          component: '',
+          label: '数据去重',
+          sort: 0,
+          component: 'dataDeduplication',
           meta: {
-            keepAlive: false,
-            allowClick: false,
             roles: [],
-            enName: 'Unstructured Data Source',
-            icon: 'mdi-widgets-outline',
-            editModules: false,
-            title: '非结构化数据源',
-            fullScreen: false,
-            target: false,
-            dataPermission: false,
-            effectiveStatus: true
+            enName: 'data Deduplication',
+            icon: '',
+            title: '数据去重',
+            fullScreen: false
           },
-          name: 'unstructured',
-          style: '',
-          alwaysShow: 0,
-          metastr: '{"keepAlive":false,"allowClick":false,"enName":"Unstructured Data Source","editModules":false,"title":"非结构化数据源","fullScreen":false,"target":false,"dataPermission":false}',
-          open: null
+          name: 'index',
+          alwaysShow: 0
         }
       ],
-      enName: 'Data collection',
-      id: 1319,
+      enName: 'data Deduplication',
       redirect: '',
-      level: 1,
-      openPath: '',
       active: '',
-      label: '数据来源',
-      sort: 47,
-      parentId: 0,
-      effectiveStatus: true,
-      parentName: '',
+      sort: 0,
       component: 'Layout',
       meta: {
         allowClick: false,
         roles: [],
-        enName: 'Data collection',
+        enName: 'data Deduplication',
         icon: 'mdi-widgets-outline',
-        title: '数据来源',
+        title: '数据去重',
         target: false,
         effectiveStatus: true
       },
-      name: 'data-origin',
-      style: '',
-      alwaysShow: 0,
-      metastr: '{"allowClick":false,"enName":"Data collection","title":"数据来源","target":false}',
-      open: null
+      name: 'dataDeduplication',
+      alwaysShow: 0
     },
+    // {
+    //   meun: '',
+    //   code: '',
+    //   hidden: 0,
+    //   rootId: 0,
+    //   icon: 'mdi-widgets-outline',
+    //   remark: '',
+    //   type: 0,
+    //   title: '数据来源',
+    //   local: '',
+    //   path: '/data-origin',
+    //   urls: '',
+    //   children: [
+
+    //     {
+    //       meun: '',
+    //       code: '',
+    //       hidden: 0,
+    //       rootId: 1319,
+    //       icon: 'mdi-widgets-outline',
+    //       remark: '',
+    //       type: 1,
+    //       title: 'RDBMS数据源',
+    //       local: '',
+    //       path: '/data-origin/rdbms',
+    //       urls: '',
+    //       children: [],
+    //       enName: 'RDBMS Data Source',
+    //       id: 1328,
+    //       redirect: '',
+    //       level: 2,
+    //       openPath: '',
+    //       active: '',
+    //       label: 'RDBMS数据源',
+    //       sort: 1,
+    //       parentId: 1319,
+    //       effectiveStatus: true,
+    //       parentName: '',
+    //       component: 'dataOrigin/rdbmsDataSource',
+    //       meta: {
+    //         keepAlive: false,
+    //         allowClick: false,
+    //         roles: [],
+    //         enName: 'RDBMS Data Source',
+    //         icon: 'mdi-widgets-outline',
+    //         editModules: false,
+    //         title: 'RDBMS数据源',
+    //         fullScreen: false,
+    //         target: false,
+    //         dataPermission: false,
+    //         effectiveStatus: true
+    //       },
+    //       name: 'data-origin',
+    //       style: '',
+    //       alwaysShow: 0,
+    //       metastr: '{"keepAlive":false,"allowClick":false,"enName":"RDBMS Data Source","editModules":false,"title":"RDBMS数据源","fullScreen":false,"target":false,"dataPermission":false}',
+    //       open: null
+    //     },
+    //     {
+    //       meun: '',
+    //       code: '',
+    //       hidden: 0,
+    //       rootId: 1319,
+    //       icon: 'mdi-widgets-outline',
+    //       remark: '',
+    //       type: 1,
+    //       title: '非结构化数据源',
+    //       local: '',
+    //       path: '/data-origin/unstructured',
+    //       urls: '',
+    //       children: [
+    //         {
+    //           meun: '',
+    //           code: '',
+    //           hidden: 0,
+    //           rootId: 1319,
+    //           icon: 'mdi-account-plus-outline',
+    //           remark: '',
+    //           type: 1,
+    //           title: '手动收集',
+    //           local: '',
+    //           path: '/data-origin/unstructured/manual-collection',
+    //           urls: '',
+    //           children: [],
+    //           enName: 'Manual collection',
+    //           id: 1320,
+    //           redirect: '',
+    //           level: 3,
+    //           openPath: '',
+    //           active: '',
+    //           label: '手动收集',
+    //           sort: 1,
+    //           parentId: 1327,
+    //           effectiveStatus: true,
+    //           parentName: '',
+    //           component: 'dataOrigin/unstructuredData/manualCollection',
+    //           meta: {
+    //             keepAlive: false,
+    //             allowClick: false,
+    //             roles: [
+    //               {
+    //                 active: '1',
+    //                 alwaysShow: 0,
+    //                 children: [],
+    //                 code: '',
+    //                 component: '',
+    //                 effectiveStatus: true,
+    //                 enName: 'Excel Import',
+    //                 hidden: 0,
+    //                 icon: '',
+    //                 id: 1321,
+    //                 label: 'Excel导入',
+    //                 level: 3,
+    //                 local: '',
+    //                 meta: null,
+    //                 metastr: '{"enName":"Excel Import","title":"Excel导入","target":false}',
+    //                 meun: '',
+    //                 name: 'excelImport',
+    //                 open: 0,
+    //                 openPath: '',
+    //                 parentId: 1320,
+    //                 parentName: '',
+    //                 path: '',
+    //                 redirect: '',
+    //                 remark: '',
+    //                 rootId: 1319,
+    //                 sort: 0,
+    //                 style: '',
+    //                 type: 3,
+    //                 urls: ''
+    //               },
+    //               {
+    //                 active: '1',
+    //                 alwaysShow: 0,
+    //                 children: [],
+    //                 code: '',
+    //                 component: '',
+    //                 effectiveStatus: true,
+    //                 enName: 'Image Import',
+    //                 hidden: 0,
+    //                 icon: '',
+    //                 id: 1322,
+    //                 label: '名片解析',
+    //                 level: 3,
+    //                 local: '',
+    //                 meta: null,
+    //                 metastr: '{"enName":"Image Import","title":"名片解析","target":false}',
+    //                 meun: '',
+    //                 name: 'imageImport',
+    //                 open: 0,
+    //                 openPath: '',
+    //                 parentId: 1320,
+    //                 parentName: '',
+    //                 path: '',
+    //                 redirect: '',
+    //                 remark: '',
+    //                 rootId: 1319,
+    //                 sort: 5,
+    //                 style: '',
+    //                 type: 3,
+    //                 urls: ''
+    //               },
+    //               {
+    //                 active: '1',
+    //                 alwaysShow: 0,
+    //                 children: [],
+    //                 code: '',
+    //                 component: '',
+    //                 effectiveStatus: true,
+    //                 enName: 'Manual Import',
+    //                 hidden: 0,
+    //                 icon: '',
+    //                 id: 1323,
+    //                 label: '手动输入',
+    //                 level: 3,
+    //                 local: '',
+    //                 meta: null,
+    //                 metastr: '{"enName":"Manual Import","title":"手动输入","target":false}',
+    //                 meun: '',
+    //                 name: 'manualImport',
+    //                 open: 0,
+    //                 openPath: '',
+    //                 parentId: 1320,
+    //                 parentName: '',
+    //                 path: '',
+    //                 redirect: '',
+    //                 remark: '',
+    //                 rootId: 1319,
+    //                 sort: 10,
+    //                 style: '',
+    //                 type: 3,
+    //                 urls: ''
+    //               }
+    //             ],
+    //             enName: 'Manual collection',
+    //             icon: 'mdi-account-plus-outline',
+    //             editModules: false,
+    //             title: '手动收集',
+    //             fullScreen: false,
+    //             target: false,
+    //             dataPermission: false,
+    //             effectiveStatus: true
+    //           },
+    //           name: 'manual-collection',
+    //           style: '',
+    //           alwaysShow: 0,
+    //           metastr: '{"keepAlive":false,"allowClick":false,"enName":"Manual collection","editModules":false,"title":"手动收集","fullScreen":false,"target":false,"dataPermission":false}',
+    //           open: null
+    //         },
+    //         {
+    //           meun: '',
+    //           code: '',
+    //           hidden: 0,
+    //           rootId: 1319,
+    //           icon: 'mdi-bug',
+    //           remark: '',
+    //           type: 1,
+    //           title: '自动收集',
+    //           local: '',
+    //           path: '/data-origin/unstructured/auto-collection',
+    //           urls: '',
+    //           children: [],
+    //           enName: 'Auto collection',
+    //           id: 1324,
+    //           redirect: '',
+    //           level: 3,
+    //           openPath: '',
+    //           active: '',
+    //           label: '自动收集',
+    //           sort: 1,
+    //           parentId: 1327,
+    //           effectiveStatus: true,
+    //           parentName: '',
+    //           component: 'dataOrigin/unstructuredData/autoCollection',
+    //           meta: {
+    //             keepAlive: false,
+    //             allowClick: false,
+    //             roles: [
+    //               {
+    //                 active: '1',
+    //                 alwaysShow: 0,
+    //                 children: [],
+    //                 code: '',
+    //                 component: '',
+    //                 effectiveStatus: true,
+    //                 enName: 'Spider Management',
+    //                 hidden: 0,
+    //                 icon: 'mdi-bug',
+    //                 id: 1325,
+    //                 label: '爬虫管理',
+    //                 level: 3,
+    //                 local: '',
+    //                 meta: null,
+    //                 metastr: '{"enName":"Spider Management","title":"爬虫管理","target":false}',
+    //                 meun: '',
+    //                 name: 'spiderManagement',
+    //                 open: 0,
+    //                 openPath: '',
+    //                 parentId: 1324,
+    //                 parentName: '',
+    //                 path: '',
+    //                 redirect: '',
+    //                 remark: '',
+    //                 rootId: 1319,
+    //                 sort: 1,
+    //                 style: '',
+    //                 type: 3,
+    //                 urls: ''
+    //               },
+    //               {
+    //                 active: '1',
+    //                 alwaysShow: 0,
+    //                 children: [],
+    //                 code: '',
+    //                 component: '',
+    //                 effectiveStatus: true,
+    //                 enName: 'Page Parsing',
+    //                 hidden: 0,
+    //                 icon: 'mdi-bug',
+    //                 id: 1326,
+    //                 label: '网页解析',
+    //                 level: 3,
+    //                 local: '',
+    //                 meta: null,
+    //                 metastr: '{"enName":"Page Parsing","title":"网页解析","target":false}',
+    //                 meun: '',
+    //                 name: 'pageParsing',
+    //                 open: 0,
+    //                 openPath: '',
+    //                 parentId: 1324,
+    //                 parentName: '',
+    //                 path: '',
+    //                 redirect: '',
+    //                 remark: '',
+    //                 rootId: 1319,
+    //                 sort: 1,
+    //                 style: '',
+    //                 type: 3,
+    //                 urls: ''
+    //               }
+    //             ],
+    //             enName: 'Auto collection',
+    //             icon: 'mdi-bug',
+    //             editModules: false,
+    //             title: '自动收集',
+    //             fullScreen: false,
+    //             target: false,
+    //             dataPermission: false,
+    //             effectiveStatus: true
+    //           },
+    //           name: 'auto-collection',
+    //           style: '',
+    //           alwaysShow: 0,
+    //           metastr: '{"keepAlive":false,"allowClick":false,"enName":"Auto collection","editModules":false,"title":"自动收集","fullScreen":false,"target":false,"dataPermission":false}',
+    //           open: null
+    //         }
+    //       ],
+    //       enName: 'Unstructured Data Source',
+    //       id: 1327,
+    //       redirect: '',
+    //       level: 2,
+    //       openPath: '',
+    //       active: '',
+    //       label: '非结构化数据源',
+    //       sort: 10,
+    //       parentId: 1319,
+    //       effectiveStatus: true,
+    //       parentName: '',
+    //       component: '',
+    //       meta: {
+    //         keepAlive: false,
+    //         allowClick: false,
+    //         roles: [],
+    //         enName: 'Unstructured Data Source',
+    //         icon: 'mdi-widgets-outline',
+    //         editModules: false,
+    //         title: '非结构化数据源',
+    //         fullScreen: false,
+    //         target: false,
+    //         dataPermission: false,
+    //         effectiveStatus: true
+    //       },
+    //       name: 'unstructured',
+    //       style: '',
+    //       alwaysShow: 0,
+    //       metastr: '{"keepAlive":false,"allowClick":false,"enName":"Unstructured Data Source","editModules":false,"title":"非结构化数据源","fullScreen":false,"target":false,"dataPermission":false}',
+    //       open: null
+    //     }
+    //   ],
+    //   enName: 'Data collection',
+    //   id: 1319,
+    //   redirect: '',
+    //   level: 1,
+    //   openPath: '',
+    //   active: '',
+    //   label: '数据来源',
+    //   sort: 47,
+    //   parentId: 0,
+    //   effectiveStatus: true,
+    //   parentName: '',
+    //   component: 'Layout',
+    //   meta: {
+    //     allowClick: false,
+    //     roles: [],
+    //     enName: 'Data collection',
+    //     icon: 'mdi-widgets-outline',
+    //     title: '数据来源',
+    //     target: false,
+    //     effectiveStatus: true
+    //   },
+    //   name: 'data-origin',
+    //   style: '',
+    //   alwaysShow: 0,
+    //   metastr: '{"allowClick":false,"enName":"Data collection","title":"数据来源","target":false}',
+    //   open: null
+    // },
     {
       hidden: 0,
       rootId: 0,

+ 202 - 0
src/views/dataDeduplication/components/edit.vue

@@ -0,0 +1,202 @@
+<template>
+  <m-form ref="form" class="mt-5" :items="formItems" v-model="formValues">
+    <template #name_en>
+      <v-btn color="primary" class="ml-3" @click="getTranslate" :loading="translateLoading">翻译</v-btn>
+    </template>
+    <template #tag>
+      <div class="mb-6" style="border: 1px dashed #666; padding: 10px; border-radius: 5px; width: 100%;">
+        <v-chip-group
+          v-if="tagItems.length"
+          v-model="formValues.tag"
+          multiple
+          column
+          active-class="primary--text"
+        >
+          <v-chip v-for="tag in tagItems" :key="tag.id" filter :value="tag">
+            {{ tag.name_zh }}
+          </v-chip>
+        </v-chip-group>
+        <div v-else class="text-center" style="color: #999; padding: 10px;">暂无可选标签</div>
+      </div>
+    </template>
+  </m-form>
+</template>
+
+<script>
+import MForm from '@/components/MForm'
+import {
+  getTranslate
+} from '@/api'
+
+import { metadata } from '@/utils/dataGovernance'
+import { api } from '@/api/dataGovernance'
+
+export default {
+  name: 'metadata-edit',
+  components: { MForm },
+  props: {
+    itemData: {
+      type: Object,
+      default: () => ({})
+    }
+  },
+  data () {
+    return {
+      translateLoading: false,
+      formValues: {
+        name_zh: null,
+        name_en: null,
+        category: null,
+        alias: null,
+        affiliation: null,
+        data_type: null,
+        tag: [],
+        describe: null,
+        status: 1
+      },
+      pageInfo: {
+        size: 50,
+        current: 1
+      },
+      total: 0,
+      loading: false,
+      tagItems: []
+    }
+  },
+  computed: {
+    formItems () {
+      return [
+        {
+          type: 'text',
+          key: 'name_zh',
+          label: '请输入中文名称 *',
+          rules: [v => !!v || '请输入中文名称']
+        },
+        {
+          type: 'text',
+          key: 'name_en',
+          label: '请输入英文名称 *',
+          rules: [v => !!v || '请输入英文名称'],
+          slotName: 'name_en'
+        },
+        {
+          type: 'autocomplete',
+          key: 'category',
+          label: '请选择分类 *',
+          col: 6,
+          noAttach: true,
+          rules: [v => !!v || '请选择分类'],
+          items: [...metadata]
+        },
+        {
+          type: 'text',
+          key: 'data_type',
+          label: '请输入数据类型 *',
+          col: 6,
+          rules: [v => !!v || '请输入数据类型']
+        },
+        {
+          type: 'text',
+          key: 'alias',
+          label: '请输入别名'
+        },
+        {
+          type: 'text',
+          key: 'affiliation',
+          label: '请输入制作单位'
+        },
+        {
+          // type: 'autocomplete',
+          slotName: 'tag',
+          key: 'tag',
+          // value: [],
+          slotTitle: '请选择标签',
+          slotTitleStyle: 'color: rgba(0, 0, 0, 0.6); padding: 5px'
+          // label: '请选择标签',
+          // returnObject: true,
+          // multiple: true,
+          // noAttach: true,
+          // itemText: 'name_zh',
+          // itemValue: 'id',
+          // items: this.tagItems
+        },
+        {
+          type: 'text',
+          key: 'describe',
+          label: '请输入描述'
+        },
+        {
+          type: 'ifRadio',
+          key: 'status',
+          label: '启用',
+          width: 120,
+          items: [{ label: '是', value: true }, { label: '否', value: false }]
+        }
+      ]
+    }
+  },
+  created () {
+    this.init()
+    if (!Object.keys(this.itemData).length) {
+      return
+    }
+    this.formValues = this.formItems.reduce((acc, cur) => {
+      acc[cur.key] = this.itemData[cur.key] ?? this.formValues[cur.key]
+      return acc
+    }, {})
+  },
+  methods: {
+    async init () {
+      try {
+        this.loading = true
+        try {
+          const { data } = await api.getLabelList({
+            ...this.pageInfo,
+            category_filter: 'DataOps'
+          })
+          this.tagItems = data.records
+          this.total = data.total
+        } catch (error) {
+          this.$snackbar.error(error)
+        } finally {
+          this.loading = false
+        }
+      } catch (error) {
+        this.$snackbar.error(error)
+      }
+    },
+    async getTranslate () {
+      if (!this.formValues.name_zh) {
+        this.$snackbar.error('请输入名称')
+        return
+      }
+      this.translateLoading = true
+      try {
+        const { data } = await getTranslate({
+          node_name: this.formValues.name_zh
+        })
+        this.formValues.name_en = data.translated
+      } catch (error) {
+        this.$snackbar.error(error)
+      } finally {
+        this.translateLoading = false
+      }
+    },
+    getValue () {
+      if (!this.$refs.form.validate()) {
+        return
+      }
+      const id = this.itemData.id
+      return {
+        ...this.formValues,
+        id
+      }
+    }
+  }
+
+}
+</script>
+
+<style lang="scss" scoped>
+
+</style>

+ 135 - 0
src/views/dataDeduplication/index.vue

@@ -0,0 +1,135 @@
+<template>
+  <div class="white pa-3">
+    <m-filter :option="filter" @search="handleSearch" />
+    <m-table
+      class="mt-3"
+      :loading="loading"
+      :headers="headers"
+      :items="items"
+      :total="total"
+      :is-tools="false"
+      :disable-sort="true"
+      :page-info="pageInfo"
+      :show-select="false"
+      :can-delete="false"
+      @pageHandleChange="pageHandleChange"
+    >
+      <template #status="{ item }">
+        <v-chip small :color="item.status === 'active' ? 'success' : 'error'">
+          {{ item.status === 'active' ? '启用' : '禁用' }}
+        </v-chip>
+      </template>
+      <template #actions="{ item }">
+        <v-btn color="primary" text class="mr-2" @click="onEdit(item)">编辑</v-btn>
+        <v-btn color="error" text  @click="onDelete(item)">删除</v-btn>
+      </template>
+    </m-table>
+    <m-dialog title="数据去重" :visible.sync="show" fullscreen :footer="false">
+      <edit-page v-if="show" ref="edit" :item-data="itemData" @success="show = false; init()"></edit-page>
+    </m-dialog>
+  </div>
+</template>
+
+<script>
+import MFilter from '@/components/Filter'
+import MTable from '@/components/List/table.vue'
+import MDialog from '@/components/Dialog'
+import EditPage from './components/edit'
+import { api } from '@/api/dataGovernance'
+export default {
+  name: 'dataProcess',
+  components: {
+    MFilter,
+    MTable,
+    MDialog,
+    EditPage
+  },
+  data () {
+    return {
+      loading: false,
+      show: false,
+      filter: {
+        list: [
+          { type: 'textField', value: '', label: '关键词', key: 'title' }
+        ]
+      },
+      queryData: {
+        title: null
+      },
+      headers: [
+        { text: '中文名称', align: 'start', value: 'name_zh' },
+        { text: '英文名称', align: 'start', value: 'name_en' },
+        { text: '状态', align: 'center', value: 'status' },
+        { text: '分类', align: 'center', value: 'category' },
+        { text: '作者', align: 'center', value: 'leader' },
+        { text: '机构', align: 'center', value: 'organization' },
+        { text: '描述', align: 'start', value: 'describe' },
+        { text: '创建时间', align: 'start', value: 'created_at' },
+        { text: '更新时间', align: 'start', value: 'updated_at' },
+        { text: '操作', align: 'start', value: 'actions' }
+      ],
+      itemData: {},
+      items: [],
+      pageInfo: {
+        size: 10,
+        current: 1
+      },
+      total: 0
+    }
+  },
+  created () {
+    // this.init()
+  },
+  methods: {
+    async init () {
+      this.loading = true
+      try {
+        const { data } = await api.getDataFlowList({
+          page: this.pageInfo.current,
+          page_size: this.pageInfo.size,
+          search: this.queryData.title || undefined
+        })
+        this.items = data.list
+        this.total = data.pagination.total
+      } catch (error) {
+        this.$snackbar.error(error)
+      } finally {
+        this.loading = false
+      }
+    },
+    handleSearch (val) {
+      Object.assign(this.queryData, val)
+      this.pageInfo.current = 1
+      this.init()
+    },
+    handleAdd () {
+      this.itemData = {}
+      this.show = true
+    },
+    async onEdit (item) {
+      this.itemData = item
+      this.show = true
+    },
+    onDelete ({ id }) {
+      this.$confirm('提示', '是否删除该选项')
+        .then(async () => {
+          try {
+            await api.deleteDataFlow(id)
+            this.$snackbar.success('删除成功')
+            this.init()
+          } catch (error) {
+            this.$snackbar.error('删除失败')
+          }
+        })
+    },
+    pageHandleChange (page) {
+      this.pageInfo.current = page
+      this.init()
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+
+</style>

+ 266 - 0
src/views/dataGovernance/dataSource/components/edit.vue

@@ -0,0 +1,266 @@
+<template>
+  <div>
+    <!-- <div class="pa-2 d-flex">
+      <v-textarea rows="2" outlined dense placeholder="快捷解析"></v-textarea>
+      <v-btn class="ml-3">解析</v-btn>
+    </div> -->
+    <MForm ref="formData" :items="formData" v-model="formValues">
+      <div class="pa-2 d-flex align-center justify-center">
+        <v-btn
+          v-for="(item, index) in buttons"
+          :key="index"
+          :loading="item.loading"
+          @click="item.handler(item)" rounded :color="item.color" class="buttons mr-3">
+          {{ item.text }}
+        </v-btn>
+      </div>
+    </MForm>
+    <m-dialog title="快捷解析" :visible.sync="show" @submit="onSubmit">
+      <v-textarea rows="3" outlined dense placeholder="快捷解析" v-model="text"></v-textarea>
+
+      <Linear :visible.sync="loading"></Linear>
+    </m-dialog>
+  </div>
+</template>
+
+<script>
+import MForm from '@/components/MForm'
+import MDialog from '@/components/Dialog'
+import Linear from '@/components/Progress/linear.vue'
+import {
+  datasourceConnectTest,
+  datasourceValid,
+  datasourceParse
+} from '@/api/dataOrigin'
+export default {
+  name: 'source-edit',
+  components: { MForm, MDialog, Linear },
+  props: {
+    // typeItems: {
+    //   type: Array,
+    //   default: () => []
+    // },
+    itemData: {
+      type: Object,
+      default: () => {}
+    }
+  },
+  data () {
+    return {
+      buttons: [
+        {
+          loading: false,
+          text: '验证',
+          color: 'primary',
+          handler: this.handleValid
+        },
+        {
+          loading: false,
+          text: '连接测试',
+          color: 'warning',
+          handler: this.handleTest
+        },
+        {
+          loading: false,
+          text: '快捷解析',
+          color: 'info',
+          handler: this.handleParse
+        }
+      ],
+      loading: false,
+      text: null,
+      show: false,
+      formValues: {
+        name_zh: null,
+        name_en: null,
+        type: null,
+        host: null,
+        port: null,
+        database: null,
+        username: null,
+        password: null,
+        param: null,
+        status: true,
+        desc: null
+      }
+    }
+  },
+  computed: {
+    formData () {
+      return [
+        {
+          type: 'text',
+          key: 'name_zh',
+          label: '请输入数据源中文名称 *',
+          outlined: true,
+          dense: true,
+          rules: [v => !!v || '请输入数据源中文名称']
+        },
+        {
+          type: 'text',
+          key: 'name_en',
+          label: '请输入数据源英文名称 *',
+          disabled: !!this.itemData.id,
+          outlined: true,
+          dense: true,
+          rules: [v => !!v || '请输入数据源英文名称']
+        },
+        {
+          type: 'text',
+          key: 'type',
+          label: '请选择数据库类型 *',
+          outlined: true,
+          dense: true,
+          rules: [v => !!v || '请选择数据库类型']
+          // items: this.typeItems
+        },
+        // {
+        //   type: 'autocomplete',
+        //   key: 'type',
+        //   label: '请选择数据库类型 *',
+        //   outlined: true,
+        //   dense: true,
+        //   rules: [v => !!v || '请选择数据库类型'],
+        //   items: this.typeItems
+        // },
+        {
+          type: 'text',
+          key: 'host',
+          label: '请输入数据库服务器IP地址 *',
+          col: 8,
+          outlined: true,
+          dense: true,
+          rules: [v => !!v || '请输入数据库服务器IP地址']
+        },
+        {
+          type: 'text',
+          key: 'port',
+          label: '请输入数据库服务器IP端口 *',
+          col: 4,
+          outlined: true,
+          dense: true,
+          rules: [v => !!v || '请输入数据库服务器IP端口']
+        },
+        {
+          type: 'text',
+          key: 'database',
+          label: '请输入数据库名称 *',
+          outlined: true,
+          dense: true,
+          rules: [v => !!v || '请输入数据库名称']
+        },
+        {
+          type: 'text',
+          key: 'username',
+          col: '6',
+          label: '请输入用户名 *',
+          outlined: true,
+          dense: true,
+          rules: [v => !!v || '请输入用户名']
+        },
+        {
+          type: 'password',
+          key: 'password',
+          col: '6',
+          label: '请输入密码 *',
+          outlined: true,
+          dense: true,
+          rules: [v => !!v || '请输入密码']
+        },
+        {
+          type: 'text',
+          key: 'param',
+          label: '请输入连接参数 *',
+          outlined: true,
+          dense: true,
+          rules: [v => !!v || '请输入连接参数']
+        },
+        {
+          type: 'ifRadio',
+          key: 'status',
+          label: '状态',
+          items: [
+            { value: true, label: '启用' },
+            { value: false, label: '关闭' }
+          ]
+        },
+        {
+          type: 'textarea',
+          key: 'desc',
+          outlined: true,
+          label: '请输入描述'
+        }
+      ]
+    }
+  },
+  created () {
+    if (Object.keys(this.itemData).length) {
+      Object.assign(this.formValues, this.itemData)
+    }
+  },
+  methods: {
+    validate () {
+      return this.$refs.formData.validate()
+    },
+    getQuery () {
+      return this.formValues
+    },
+    async handleTest (item) {
+      item.loading = true
+      const { status, ...obj } = this.formValues
+      try {
+        const { data } = await datasourceConnectTest(obj)
+        if (data.connected) {
+          this.$snackbar.success(data.message)
+        } else {
+          this.$snackbar.error(data.message)
+        }
+      } catch (error) {
+        this.$snackbar.error(error)
+      } finally {
+        item.loading = false
+      }
+    },
+    async handleValid (item) {
+      const { status, ...obj } = this.formValues
+      item.loading = true
+      try {
+        const { data } = await datasourceValid(obj)
+        if (data.exists) {
+          this.$snackbar.warning(data.message)
+        } else {
+          this.$snackbar.success('验证通过')
+        }
+      } catch (error) {
+        this.$snackbar.error(error)
+      } finally {
+        item.loading = false
+      }
+    },
+    handleParse () {
+      this.show = true
+    },
+    async onSubmit () {
+      if (!this.text) {
+        this.$snackbar.warning('请输入解析字符串')
+        return
+      }
+      try {
+        this.loading = true
+        const { data } = await datasourceParse({ conn_str: this.text })
+        Object.assign(this.formValues, data.data_source)
+        this.$snackbar.success('解析成功')
+        this.show = false
+      } catch (error) {
+        this.$snackbar.error(error)
+      } finally {
+        this.loading = false
+      }
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+
+</style>

+ 196 - 0
src/views/dataGovernance/dataSource/index.vue

@@ -0,0 +1,196 @@
+<template>
+  <div class="pa-3" style="background-color: #FFF;">
+    <filter-list :option="filter" @search="handleSearch" />
+    <table-list
+      class="mt-3"
+      :loading="loading"
+      :headers="headers"
+      :items="items"
+      :total="total"
+      :page-info="pageInfo"
+      :show-select="false"
+      @add="handleAdd"
+      @pageHandleChange="pageHandleChange"
+      @sort="handleSort"
+    >
+      <template #actions="{ item }">
+        <v-btn text color="primary" @click="handleEdit(item)">编辑</v-btn>
+        <v-btn text color="error" @click="handleDelete(item.id)">删除</v-btn>
+      </template>
+      <template v-slot:remark="{item}">
+        <td >
+          {{ item.remark && item.remark.substr(0, 8) }}
+          <template v-if="item.remark && item.remark.length > 8">...</template>
+        </td>
+      </template>
+      <template #status="{ item }">
+        <v-chip :color="item.status ? 'success' : 'error'" small>{{ item.status ? '启用' : '禁用' }}</v-chip>
+      </template>
+    </table-list>
+    <edit-dialog :title="title" :visible.sync="show" @submit="handleSubmit">
+      <edit-page class="pt-5" v-if="show" ref="edit" :type-items="dataSource_type" :item-data="itemData" @test="handleTest"></edit-page>
+    </edit-dialog>
+
+    <Linear :visible.sync="submitLoading"></Linear>
+  </div>
+</template>
+
+<script>
+import EditPage from './components/edit.vue'
+import FilterList from '@/components/Filter'
+import TableList from '@/components/List/table.vue'
+import EditDialog from '@/components/Dialog'
+import Linear from '@/components/Progress/linear.vue'
+import {
+  sourceConfigTest
+  // sourceAdd,
+  // sourceUpdate,
+  // sourceDelete
+} from '@/api/dataFactory'
+import {
+  getDatasourceList,
+  saveDatasource,
+  deleteDatasource
+} from '@/api/dataOrigin'
+
+export default {
+  name: 'RDbmsDataSource',
+  components: { FilterList, TableList, EditDialog, EditPage, Linear },
+  data () {
+    return {
+      show: false,
+      filter: {
+        list: [
+          { type: 'textField', value: '', label: '数据源名称', key: 'name_zh' }
+          // { type: 'autocomplete', value: null, label: '配置类型', key: 'type', items: [] }
+        ]
+      },
+      queryForm: {
+        name_zh: '' // 配置名称
+      },
+      pageInfo: {
+        current: 1,
+        size: 10
+      },
+      total: 0,
+      orders: [],
+      loading: true,
+      submitLoading: false,
+      headers: [
+        { text: '中文名称', align: 'start', value: 'name_zh', slotName: 'name_zh' },
+        { text: '英文名称', align: 'start', value: 'name_en' },
+        { text: '数据库类型', align: 'start', value: 'type' },
+        { text: '主机地址', align: 'start', value: 'host' },
+        { text: '端口', align: 'start', value: 'port' },
+        { text: '数据库名称', align: 'start', value: 'database' },
+        { text: '用户名', align: 'start', value: 'username' },
+        { text: '连接参数', align: 'start', value: 'param' },
+        { text: '状态', align: 'start', value: 'status' },
+        { text: '更新时间', align: 'start', value: 'updateTime' },
+        { text: '备注', align: 'start', value: 'desc', useSlot: true },
+        { text: '操作', align: 'start', value: 'actions' }
+      ],
+      items: [],
+      dataSource_type: [],
+      itemData: {}
+    }
+  },
+  computed: {
+    title () {
+      return `${Object.keys(this.itemData).length ? '新增' : '编辑'}数据源`
+    }
+  },
+  created () {
+    // this.init()
+    this.initPage()
+  },
+  methods: {
+    async initPage () {
+      try {
+        this.loading = true
+        const { data } = await getDatasourceList({
+          ...this.queryForm
+        })
+        this.total = data.total
+        this.items = data.data_source
+      } catch (error) {
+        this.$snackbar.error(error)
+      } finally {
+        this.loading = false
+      }
+    },
+    handleSearch (val) {
+      this.pageInfo.current = 1
+      Object.assign(this.queryForm, val)
+      this.initPage()
+    },
+    async handleSubmit () {
+      const _ref = this.$refs.edit
+      if (_ref.validate()) {
+        const isEdit = Object.keys(this.itemData).length
+        const data = {}
+        if (isEdit) data.id = this.itemData.id
+        Object.assign(data, _ref.getQuery())
+        try {
+          this.submitLoading = true
+          const { msg } = await saveDatasource(data)
+          this.$snackbar.success(msg)
+          this.show = false
+          this.initPage()
+        } catch (error) {
+          this.$snackbar.error(error)
+        } finally {
+          this.submitLoading = false
+        }
+      }
+    },
+    async handleTest (data) {
+      try {
+        this.submitLoading = true
+        const { msg } = await sourceConfigTest(data)
+        this.$snackbar.success(msg)
+      } catch (error) {
+        this.$snackbar.error(error)
+      } finally {
+        this.submitLoading = false
+      }
+    },
+    // table 关联操作 新增
+    handleAdd () {
+      this.show = true
+      this.itemData = {}
+    },
+    // table 关联操作 编辑
+    handleEdit (item) {
+      this.itemData = item
+      this.show = true
+    },
+    // table 关联操作 删除
+    handleDelete (id) {
+      // if (!ids.length) return this.$snackbar.warning('请选择删除项')
+      this.$confirm('提示', '是否确定删除该选项').then(async () => {
+        try {
+          await deleteDatasource({ id })
+          this.$snackbar.success('删除成功')
+          this.initPage()
+        } catch (error) {
+          this.$snackbar.error(error)
+        }
+      })
+    },
+    // table 关联操作 切换分页
+    pageHandleChange (index) {
+      this.pageInfo.current = index
+      this.initPage()
+    },
+    handleSort (val) {
+      this.orders = val
+      this.initPage()
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+
+</style>