ZHOUTD 1 рік тому
батько
коміт
be0d18f040

+ 26 - 2
xzl-admin/src/main/java/com/xzl/web/controller/DataGovernanceController.java

@@ -8,12 +8,19 @@ import com.xzl.web.model.dataGovernance.entity.DatabaseInfo;
 import com.xzl.web.model.dataGovernance.entity.SysDataLog;
 import com.xzl.web.model.dataGovernance.entity.TableInfo;
 import com.xzl.web.service.DataGovernanceService;
+import org.apache.commons.io.IOUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletResponse;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.net.URLEncoder;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -60,7 +67,7 @@ public class DataGovernanceController {
     }
 
     @RequestMapping(value = "/getTableTitleList", method = RequestMethod.GET)
-    public List<Map> getTableTitleList(String tableName){
+    public List<String> getTableTitleList(String tableName){
         return dataGovernanceService.getTableTitleList(tableName);
     }
 
@@ -93,5 +100,22 @@ public class DataGovernanceController {
         }
     }
 
-
+    @RequestMapping(value = "/exportTable")
+    public void exportTable(@RequestParam(value = "databaseName") String databaseName,
+                            @RequestParam(value = "tableName") String tableName,
+                            HttpServletResponse response) throws Exception{
+        try {
+            File file = dataGovernanceService.exportTable(databaseName, tableName);
+            ServletOutputStream outputStream = response.getOutputStream();
+            response.setHeader("Content-Disposition", String.format(
+                    "attachment; filename=\"%s\"",
+                    URLEncoder.encode(tableName+".sql", "UTF-8")));
+            response.setContentType("application/octet-stream;charset=UTF-8");
+            IOUtils.copy(new FileInputStream(file), outputStream);
+            outputStream.flush();
+            outputStream.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
 }

+ 3 - 1
xzl-admin/src/main/java/com/xzl/web/mapper/DataGovernanceMapper.java

@@ -25,7 +25,7 @@ public interface DataGovernanceMapper {
 
     void dropTable(String tableName);
 
-    List<Map> getTableTitleListByTableName(Map<String,String> param);
+    List<String> getTableTitleListByTableName(Map<String,String> param);
 
     List<Map> getTableDataByTableName(String tableName);
 
@@ -37,4 +37,6 @@ public interface DataGovernanceMapper {
 
     List<SysDataLog> getSysDataLogList(Map<String,String> param);
 
+    Map<String, String> getCreateTableSql(String tableName);
+
 }

+ 4 - 1
xzl-admin/src/main/java/com/xzl/web/service/DataGovernanceService.java

@@ -9,6 +9,7 @@ import com.xzl.web.model.dataGovernance.entity.SysDataLog;
 import com.xzl.web.model.dataGovernance.entity.TableInfo;
 import org.springframework.web.multipart.MultipartFile;
 
+import java.io.File;
 import java.util.List;
 import java.util.Map;
 
@@ -26,7 +27,7 @@ public interface DataGovernanceService {
 
     Map<String, String> dropTable(List<String> list);
 
-    List<Map> getTableTitleList(String tableName);
+    List<String> getTableTitleList(String tableName);
 
     List<Map> getTableData(String tableName);
 
@@ -35,4 +36,6 @@ public interface DataGovernanceService {
     Result<SysDataLog> getDataLog(SysDataLogQueryParam param);
 
     Map<String, String> importData(String databaseName, MultipartFile file) throws Exception;
+
+    File exportTable(String databaseName, String tableName) throws Exception;
 }

+ 66 - 3
xzl-admin/src/main/java/com/xzl/web/service/impl/DataGovernanceServiceImpl.java

@@ -46,6 +46,9 @@ public class DataGovernanceServiceImpl implements DataGovernanceService {
     @Value("${spring.datasource.druid.master.password}")
     private String password;
 
+    @Value("${sqlFilePath}")
+    private String sqlFilePath;
+
 
     @Override
     public List<DatabaseInfo> getDatabaseList() {
@@ -169,7 +172,7 @@ public class DataGovernanceServiceImpl implements DataGovernanceService {
     }
 
     @Override
-    public List<Map> getTableTitleList(String tableName) {
+    public List<String> getTableTitleList(String tableName) {
         Map<String, String> param = new HashMap<>();
         String[] strings = tableName.split("\\.");
         param.put("dataBaseName", strings[0]);
@@ -270,11 +273,71 @@ public class DataGovernanceServiceImpl implements DataGovernanceService {
         scriptRunner.runScript(isr);
         scriptRunner.closeConnection();
         isr.close();
-        result.put("message", "复制失败!选择的表结构不同");
-        result.put("type", "error");
+        result.put("message", "导入成功");
+        result.put("type", "success");
         return result;
     }
 
+    @Override
+    public File exportTable(String databaseName, String tableName) throws Exception {
+        String table = databaseName + "." + tableName;
+        Map<String, String> createTableSql = dataGovernanceMapper.getCreateTableSql(table);
+        List<Map> tableData = dataGovernanceMapper.getTableDataByTableName(table);
+        Map<String, String> param = new HashMap<>();
+        param.put("dataBaseName", databaseName);
+        param.put("tableName", tableName);
+        List<String> tableTitle = dataGovernanceMapper.getTableTitleListByTableName(param);
+        String fileName = sqlFilePath +"/" + tableName + ".sql";
+        File file = new File(fileName);
+        if (file.exists()) {
+            file.delete();
+        }
+        file.createNewFile();
+        FileWriter fw = null;
+        BufferedWriter bw = null;
+        fw = new FileWriter(file);
+        bw = new BufferedWriter(fw);
+        bw.write("");
+        bw.append("SET NAMES utf8mb4;\n");
+        bw.append("SET FOREIGN_KEY_CHECKS = 0;\n");
+        bw.append("DROP TABLE IF EXISTS `" + tableName + "`;\n");
+        bw.append(createTableSql.get("Create Table"));
+        bw.append(";\n");
+        for (Map datum : tableData) {
+            StringBuilder sqlBuilder = new StringBuilder("");
+            StringBuilder valueBuilder = new StringBuilder("");
+            sqlBuilder.append("INSERT INTO `");
+            sqlBuilder.append(tableName);
+            sqlBuilder.append("`(");
+            valueBuilder.append("(");
+            for (String title : tableTitle) {
+                Object data = datum.get(title);
+                if(data!=null){
+                    valueBuilder.append("'");
+                    valueBuilder.append(data);
+                    valueBuilder.append("'");
+                    valueBuilder.append(",");
+                }else{
+                    valueBuilder.append(data);
+                    valueBuilder.append(",");
+                }
+                sqlBuilder.append(title);
+                sqlBuilder.append(",");
+
+            }
+            sqlBuilder.deleteCharAt(sqlBuilder.length() - 1);
+            valueBuilder.deleteCharAt(valueBuilder.length() - 1);
+            sqlBuilder.append(") VALUES");
+            valueBuilder.append(");\n");
+            sqlBuilder.append(valueBuilder);
+            bw.append(sqlBuilder.toString());
+        }
+
+        bw.close();
+        fw.close();
+        return file;
+    }
+
 
     private Boolean verifySQLName(String text) {
         return text.isEmpty() || !text.matches("^[a-zA-Z_][a-zA-Z0-9_]{0,63}$");

+ 3 - 2
xzl-admin/src/main/resources/application-dev.yml

@@ -63,5 +63,6 @@ spring:
                 wall:
                     config:
                         multi-statement-allow: true
-pythonFilePath: D:/Projects/xtyc_yhhx/xzl-admin/src/main/resources/python
-pythonPath: D:/python310/python.exe
+pythonFilePath: /usr/local/python/
+pythonPath: /usr/local/Cellar/python@3.10/3.10.11/bin/python3.10
+sqlFilePath: D:/sql

+ 5 - 1
xzl-admin/src/main/resources/mapper/DataGovernanceMapper.xml

@@ -20,7 +20,7 @@
         order by createTime desc
     </select>
 
-    <select id="getTableTitleListByTableName" resultType="map" parameterType="map">
+    <select id="getTableTitleListByTableName" resultType="string" parameterType="map">
         select column_name as "name"
         from information_schema.columns
         where TABLE_SCHEMA=#{dataBaseName} and TABLE_NAME=#{tableName}
@@ -31,6 +31,10 @@
         select * from ${tableName}
     </select>
 
+    <select id="getCreateTableSql" resultType="map" parameterType="string">
+        show create table ${tableName}
+    </select>
+
     <select id="getTableStructure" resultType="com.xzl.web.model.dataGovernance.entity.TableStructure" parameterType="map">
         SELECT
             TABLE_SCHEMA AS "tableSchema",

+ 86 - 60
xzl-ui/src/views/dataGovernance/tableManage.vue

@@ -52,6 +52,13 @@
         label="操作"
         width="200">
         <template slot-scope="scope">
+          <el-button
+            @click.native.prevent="exportTable(scope.$index, tableData)"
+            type="text"
+            size="small"
+          >
+            导出
+          </el-button>
           <el-button
             @click.native.prevent="view(scope.$index, tableData)"
             type="text"
@@ -127,6 +134,7 @@
 </template>
 <script>
 import request from '@/utils/request'
+import {download} from '@/utils/request'
 
 export default {
   data() {
@@ -147,7 +155,7 @@ export default {
           {name: "id", type: "varchar", length: "32", decimal: "", isNotNull: true, isKey: true, exegesis: "默认主键id"}
         ]
       },
-      multipleSelection:[]
+      multipleSelection: []
     }
   },
   mounted() {
@@ -163,74 +171,92 @@ export default {
         t.tableData = rs;
       })
     },
-    handleAdd() {
-      this.formVisible = true;
-    },
-    handleDelete(){
-      const t=this;
-      let data=[];
-      t.multipleSelection.forEach(row=>{
-        data.push(t.$route.query.databaseName+"."+row.tableName);
-      })
-      this.$confirm('确定删除这些数据表?', '确认信息', {
-        distinguishCancelAndClose: true,
-        confirmButtonText: '确定',
-        cancelButtonText: '取消'
-      }).then(() => {
-        request({
-          url: "/dataGovernance/dropTable",
-          method: "post",
-          data: data
-        }).then(rs => {
-          t.$message(rs);
-          t.initData()
-        })
-      }).catch(action => {
-
-      });
-
-    },
-    handleSelectionChange(val){
-      this.multipleSelection=val;
-    },
-    handleAddRow() {
-      this.form.columns.push({
-        name: "",
-        type: "",
-        length: "",
-        decimal: "",
-        isNotNull: false,
-        isKey: false,
-        exegesis: ""
-      })
-    },
-    deleteMember(index, form) {
-      this.form.columns.splice(index, 1);
-    },
-    handleClose() {
-      this.formVisible = false;
-      this.form = this.formDefault;
-    },
-    handleSave() {
+    exportTable(index, tableData) {
       const t = this;
+      // request({
+      //   url: "/dataGovernance/exportTable?databaseName=" + this.$route.query.databaseName + "&tableName="+tableData[index].tableName,
+      //   method: "get"
+      // }).then(rs => {
+      //   console.log(rs)
+      // })
+
+      var params={
+        databaseName: this.$route.query.databaseName,
+        tableName: tableData[index].tableName
+      }
+      download("/dataGovernance/exportTable",params,tableData[index].tableName+".sql",null)
+  },
+  handleAdd() {
+    this.formVisible = true;
+  },
+  handleDelete() {
+    const t = this;
+    let data = [];
+    t.multipleSelection.forEach(row => {
+      data.push(t.$route.query.databaseName + "." + row.tableName);
+    })
+    this.$confirm('确定删除这些数据表?', '确认信息', {
+      distinguishCancelAndClose: true,
+      confirmButtonText: '确定',
+      cancelButtonText: '取消'
+    }).then(() => {
       request({
-        url: "/dataGovernance/createTable",
+        url: "/dataGovernance/dropTable",
         method: "post",
-        data: t.form
+        data: data
       }).then(rs => {
         t.$message(rs);
-        if (rs.type == "success") {
-          t.handleClose();
-          t.initData()
-        }
+        t.initData()
       })
-    },
-    view(index, table) {
-      this.$tab.openPage(table[index].tableName, '/dataGovernance/tableData', {databaseName: this.$route.query.databaseName,tableName:table[index].tableName})
+    }).catch(action => {
+
+    });
+
+  },
+  handleSelectionChange(val) {
+    this.multipleSelection = val;
+  },
+  handleAddRow() {
+    this.form.columns.push({
+      name: "",
+      type: "",
+      length: "",
+      decimal: "",
+      isNotNull: false,
+      isKey: false,
+      exegesis: ""
+    })
+  },
+  deleteMember(index, form) {
+    this.form.columns.splice(index, 1);
+  },
+  handleClose() {
+    this.formVisible = false;
+    this.form = this.formDefault;
+  },
+  handleSave() {
+    const t = this;
+    request({
+      url: "/dataGovernance/createTable",
+      method: "post",
+      data: t.form
+    }).then(rs => {
+      t.$message(rs);
+      if (rs.type == "success") {
+        t.handleClose();
+        t.initData()
+      }
+    })
+  },
+  view(index, table) {
+    this.$tab.openPage(table[index].tableName, '/dataGovernance/tableData', {
+      databaseName: this.$route.query.databaseName,
+      tableName: table[index].tableName
+    })
 
-    }
   }
 }
+}
 </script>
 
 <style rel="stylesheet/scss" lang="scss">