Ver código fonte

数据治理-数据库表创建与查询

ZHOUTD 1 ano atrás
pai
commit
a565b5fdfb

+ 14 - 1
xzl-admin/src/main/java/com/xzl/web/controller/DataGovernanceController.java

@@ -1,6 +1,8 @@
 package com.xzl.web.controller;
 
+import com.xzl.web.model.dataGovernance.dto.CreateTableDTO;
 import com.xzl.web.model.dataGovernance.entity.DatabaseInfo;
+import com.xzl.web.model.dataGovernance.entity.TableInfo;
 import com.xzl.web.service.DataGovernanceService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -25,11 +27,22 @@ public class DataGovernanceController {
         return dataGovernanceService.getDatabaseList();
     }
 
+    @RequestMapping(value = "/tableList",method = RequestMethod.GET)
+    public List<TableInfo> tableList(String databaseName){
+        return dataGovernanceService.getTableListByDatabaseName(databaseName);
+    }
+
 
     @RequestMapping(value = "/createDatabase",method = RequestMethod.POST)
-    public Map<String,String> databaseList(String databaseName){
+    public Map<String,String> createDatabase(String databaseName){
         return dataGovernanceService.createDatabase(databaseName);
     }
 
 
+    @RequestMapping(value = "/createTable",method = RequestMethod.POST)
+    public Map<String,String> createTable(@RequestBody CreateTableDTO createTableDTO){
+        return dataGovernanceService.createTable(createTableDTO);
+    }
+
+
 }

+ 7 - 0
xzl-admin/src/main/java/com/xzl/web/mapper/DataGovernanceMapper.java

@@ -1,13 +1,20 @@
 package com.xzl.web.mapper;
 
+import com.xzl.web.model.dataGovernance.dto.CreateTableDTO;
 import com.xzl.web.model.dataGovernance.entity.DatabaseInfo;
+import com.xzl.web.model.dataGovernance.entity.TableInfo;
 import org.apache.ibatis.annotations.Mapper;
 
 import java.util.List;
+import java.util.Map;
 
 @Mapper
 public interface DataGovernanceMapper {
     List<DatabaseInfo> getDatabaseList();
 
     void createDatabase(String databaseName);
+
+    List<TableInfo> getTableListByDatabaseName(Map<String,String> param);
+
+    void createTable(CreateTableDTO createTableDTO);
 }

+ 13 - 0
xzl-admin/src/main/java/com/xzl/web/model/dataGovernance/dto/CreateTableDTO.java

@@ -0,0 +1,13 @@
+package com.xzl.web.model.dataGovernance.dto;
+
+import com.xzl.web.model.dataGovernance.entity.TableColumnParam;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class CreateTableDTO {
+    private String databaseName;
+    private String tableName;
+    private List<TableColumnParam> columns;
+}

+ 13 - 0
xzl-admin/src/main/java/com/xzl/web/model/dataGovernance/entity/TableColumnParam.java

@@ -0,0 +1,13 @@
+package com.xzl.web.model.dataGovernance.entity;
+
+import lombok.Data;
+
+@Data
+public class TableColumnParam {
+    private String name;
+    private String type;
+    private String length;
+    private Boolean isNotNull;
+    private Boolean isKey;
+    private String exegesis;
+}

+ 12 - 0
xzl-admin/src/main/java/com/xzl/web/model/dataGovernance/entity/TableInfo.java

@@ -0,0 +1,12 @@
+package com.xzl.web.model.dataGovernance.entity;
+
+import lombok.Data;
+
+@Data
+public class TableInfo {
+    private String tableName;
+    private String rows;
+    private String createTime;
+    private String tableCollation;
+    private String tableComment;
+}

+ 6 - 0
xzl-admin/src/main/java/com/xzl/web/service/DataGovernanceService.java

@@ -1,6 +1,8 @@
 package com.xzl.web.service;
 
+import com.xzl.web.model.dataGovernance.dto.CreateTableDTO;
 import com.xzl.web.model.dataGovernance.entity.DatabaseInfo;
+import com.xzl.web.model.dataGovernance.entity.TableInfo;
 
 import java.util.List;
 import java.util.Map;
@@ -9,5 +11,9 @@ public interface DataGovernanceService {
 
     List<DatabaseInfo> getDatabaseList();
 
+    List<TableInfo> getTableListByDatabaseName(String databaseName);
+
     Map<String, String> createDatabase(String databaseName);
+
+    Map<String, String> createTable(CreateTableDTO createTableDTO);
 }

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

@@ -2,8 +2,12 @@ package com.xzl.web.service.impl;
 
 
 import com.xzl.web.mapper.DataGovernanceMapper;
+import com.xzl.web.model.dataGovernance.dto.CreateTableDTO;
 import com.xzl.web.model.dataGovernance.entity.DatabaseInfo;
+import com.xzl.web.model.dataGovernance.entity.TableColumnParam;
+import com.xzl.web.model.dataGovernance.entity.TableInfo;
 import com.xzl.web.service.DataGovernanceService;
+import org.mybatis.spring.SqlSessionTemplate;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -24,22 +28,75 @@ public class DataGovernanceServiceImpl implements DataGovernanceService {
         return dataGovernanceMapper.getDatabaseList();
     }
 
+    @Override
+    public List<TableInfo> getTableListByDatabaseName(String databaseName) {
+        Map<String,String> param=new HashMap<>();
+        param.put("databaseName",databaseName);
+        return dataGovernanceMapper.getTableListByDatabaseName(param);
+    }
+
     @Override
     public Map<String, String> createDatabase(String databaseName) {
         Map<String,String> result = new HashMap<>();
-        if(databaseName.isEmpty()){
+        if(verifySQLName(databaseName)){
             result.put("message","数据库名称不符合规则");
             result.put("type","error");
             return result;
         }
-        if(!databaseName.matches("^[a-zA-Z_][a-zA-Z0-9_]{0,63}$")){
-            result.put("message","数据库名称不符合规则");
+
+        try {
+            dataGovernanceMapper.createDatabase(databaseName);
+        } catch (Exception e) {
+            e.printStackTrace();
+            result.put("message","创建失败!");
             result.put("type","error");
             return result;
         }
+        result.put("message","创建成功!");
+        result.put("type","success");
+        return result;
+    }
+
+    @Override
+    public Map<String, String> createTable(CreateTableDTO createTableDTO) {
+        Map<String,String> result = new HashMap<>();
+        String tableName = createTableDTO.getTableName();
+        if(verifySQLName(tableName)){
+            result.put("message","数据表名称不符合规则");
+            result.put("type","error");
+            return result;
+        }
+        List<TableColumnParam> columns = createTableDTO.getColumns();
+        for (TableColumnParam column : columns) {
+            if(verifySQLName(column.getName())){
+                result.put("message","字段名称不符合规则");
+                result.put("type","error");
+                return result;
+            }
+            if(!column.getType().equals("text") && column.getLength().isEmpty()){
+                result.put("message","类型为varchar或integer时长度不能为空!");
+                result.put("type","error");
+                return result;
+            }
+            if(column.getType().equals("varchar") && Integer.parseInt(column.getLength())>255){
+                column.setLength("255");
+            }
+        }
+
+        Map<String,String> param=new HashMap<>();
+        param.put("databaseName",createTableDTO.getDatabaseName());
+        param.put("tableName",createTableDTO.getTableName());
+        List<TableInfo> list = dataGovernanceMapper.getTableListByDatabaseName(param);
+        if(list.size() >0){
+            result.put("message","数据表名称已存在!请更换名称!");
+            result.put("type","error");
+            return result;
+        }
+
+
 
         try {
-            dataGovernanceMapper.createDatabase(databaseName);
+            dataGovernanceMapper.createTable(createTableDTO);
         } catch (Exception e) {
             e.printStackTrace();
             result.put("message","创建失败!");
@@ -50,4 +107,9 @@ public class DataGovernanceServiceImpl implements DataGovernanceService {
         result.put("type","success");
         return result;
     }
+
+
+    private Boolean verifySQLName(String text){
+        return text.isEmpty() || !text.matches("^[a-zA-Z_][a-zA-Z0-9_]{0,63}$");
+    }
 }

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

@@ -6,7 +6,18 @@
         from information_schema.schemata
     </select>
 
-
+    <select id="getTableListByDatabaseName" resultType="com.xzl.web.model.dataGovernance.entity.TableInfo" parameterType="map">
+        select
+            table_name as tableName,
+            table_rows as rows,
+            DATE_FORMAT(`create_time`, "%Y-%m-%d %H:%i:%s") as createTime,
+            table_collation as tableCollation,
+            table_comment as tableComment
+        from information_schema.tables
+        where table_schema=#{databaseName}
+        <if test="tableName!=null">and TABLE_NAME=#{tableName}</if>
+        order by createTime desc
+    </select>
 
     <update id="createDatabase" parameterType="string">
         CREATE DATABASE IF NOT EXISTS ${databaseName}
@@ -14,4 +25,12 @@
         DEFAULT COLLATE utf8mb4_general_ci
     </update>
 
+    <update id="createTable" parameterType="com.xzl.web.model.dataGovernance.dto.CreateTableDTO">
+        CREATE TABLE ${databaseName}.${tableName}(
+            <foreach collection="columns" item="column" separator=",">
+                ${column.name}<if test="column.type!='text'"> ${column.type}(${column.length})</if><if test="column.type=='text'"> ${column.type}</if><if test="column.isNotNull"> NOT NULL</if><if test="column.isKey"> PRIMARY KEY</if><if test="column.exegesis!=null"> COMMENT #{column.exegesis}</if>
+            </foreach>
+        )ENGINE=INNODB DEFAULT CHARSET=utf8mb4
+    </update>
+
 </mapper>

+ 15 - 0
xzl-ui/src/router/index.js

@@ -161,7 +161,22 @@ export const dynamicRoutes = [
         meta: { title: '修改生成配置', activeMenu: '/tool/gen' }
       }
     ]
+  },
+  {
+    path: '/dataGovernance/tableManage',
+    component: Layout,
+    hidden: true,
+    permissions: ['dataGovernance:databaseManage'],
+    children: [
+      {
+        path: '',
+        component: () => import('@/views/dataGovernance/tableManage'),
+        name: 'tableManage',
+        meta: { title: '数据库表查看', activeMenu: '/dataGovernance' }
+      }
+    ]
   }
+
 ]
 
 // 防止连续点击多次路由报错

+ 9 - 5
xzl-ui/src/views/dataGovernance/databaseManage.vue

@@ -11,7 +11,6 @@
       border
       stripe
       size="medium"
-      @selection-change="handleSelectionChange"
     >
       <el-table-column
         type="selection"
@@ -45,18 +44,16 @@
         width="200">
         <template slot-scope="scope">
           <el-button
-            @click.native.prevent="viewArea(scope.$index, tableData)"
+            @click.native.prevent="view(scope.$index, tableData)"
             type="text"
             size="small"
-            :disabled="btnEnabled"
           >
             查看
           </el-button>
           <el-button
-            @click.native.prevent="changeArea(scope.$index, tableData)"
+            @click.native.prevent="change(scope.$index, tableData)"
             type="text"
             size="small"
-            :disabled="btnEnabled"
           >
             修改
           </el-button>
@@ -127,6 +124,13 @@ export default {
         t.handleClose();
         t.initData()
       })
+    },
+    view(index,table){
+      this.$tab.openPage(table[index].databaseName, '/dataGovernance/tableManage', {databaseName:table[index].databaseName})
+    },
+    change(index,table){
+      console.log(table[index]);
+      //this.$tab.openPage("测试tab", '/dataGovernance/tableManage',null)
     }
   }
 }

+ 219 - 0
xzl-ui/src/views/dataGovernance/tableManage.vue

@@ -0,0 +1,219 @@
+<template>
+  <div>
+    <el-row style="height: 50px;padding-top: 7.2px;padding-left: 15px">
+      <el-button type="success" size="small" @click="handleAdd">增加</el-button>
+      <el-tooltip class="item" effect="dark" content="开发中...." placement="bottom">
+        <el-button type="danger" size="small">删除</el-button>
+      </el-tooltip>
+    </el-row>
+    <el-table
+      :data="tableData"
+      border
+      stripe
+      size="medium"
+    >
+      <el-table-column
+        type="selection"
+        align="center"
+        width="55">
+      </el-table-column>
+      <el-table-column
+        align="center"
+        type="index"
+        label="序号"
+        width="100">
+      </el-table-column>
+      <el-table-column
+        prop="tableName"
+        label="表名称"
+        width="200">
+      </el-table-column>
+      <el-table-column
+        prop="rows"
+        label="记录数"
+        width="200">
+      </el-table-column>
+      <el-table-column
+        prop="createTime"
+        label="创建时间"
+        width="200">
+      </el-table-column>
+      <el-table-column
+        prop="tableCollation"
+        label="排序规则"
+        width="200">
+      </el-table-column>
+      <el-table-column
+        prop="tableComment"
+        label="注释"
+        width="200">
+      </el-table-column>
+      <el-table-column
+        align="center"
+        label="操作"
+        width="200">
+        <template slot-scope="scope">
+          <el-button
+            @click.native.prevent="view(scope.$index, tableData)"
+            type="text"
+            size="small"
+          >
+            查看
+          </el-button>
+          <el-button
+            @click.native.prevent="change(scope.$index, tableData)"
+            type="text"
+            size="small"
+          >
+            修改
+          </el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <el-dialog
+      title="数据库管理"
+      :visible.sync="formVisible"
+      width="80%"
+      :before-close="handleClose"
+    >
+      <el-row style="height: 60px;padding-top: 7.2px;padding-left: 15px">
+        <el-button type="success" size="small" @click="handleAddRow">添加字段</el-button>
+        数据表名称:
+        <el-input size="small" v-model="form.tableName" autocomplete="off" style="width: 150px" ></el-input>
+      </el-row>
+      <el-table :data="form.columns" :border=true style="width: 99.99%;">
+        <el-table-column prop="name" label="名称" min-width="10%">
+          <template slot-scope="scope">
+            <el-input v-model="scope.row.name" autocomplete="off" size="small"></el-input>
+          </template>
+        </el-table-column>
+        <el-table-column prop="type" label="类型" min-width="10%">
+          <template slot-scope="scope">
+            <el-select v-model="scope.row.type">
+              <el-option label="varchar" value="varchar"></el-option>
+              <el-option label="text" value="text"></el-option>
+              <el-option label="int" value="int"></el-option>
+            </el-select>
+          </template>
+        </el-table-column>
+        <el-table-column prop="length" label="长度" min-width="11%">
+          <template slot-scope="scope">
+            <el-input v-model="scope.row.length" autocomplete="off" size="small"></el-input>
+          </template>
+        </el-table-column>
+
+        <el-table-column prop="isNotNull" label="不为NULL" min-width="7%">
+          <template slot-scope="scope">
+            <el-switch v-model="scope.row.isNotNull" ></el-switch>
+          </template>
+        </el-table-column>
+        <el-table-column prop="isKey" label="主键" min-width="5%">
+          <template slot-scope="scope">
+            <el-switch v-model="scope.row.isKey"></el-switch>
+          </template>
+        </el-table-column>
+        <el-table-column prop="exegesis" label="注释" min-width="32%">
+          <template slot-scope="scope">
+            <el-input v-model="scope.row.exegesis" autocomplete="off" size="small"></el-input>
+          </template>
+        </el-table-column>
+        <el-table-column label="操作" min-width="10%">
+          <template slot-scope="scope">
+            <el-button size="mini" type="danger" plain @click="delmembers(scope.$index, scope.row)">删除</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="handleSave">保 存</el-button>
+      </div>
+    </el-dialog>
+
+  </div>
+</template>
+<script>
+import request from '@/utils/request'
+
+export default {
+  data() {
+    return {
+      tableData: [],
+      formVisible: false,
+      form: {
+        databaseName: this.$route.query.databaseName,
+        tableName: "",
+        columns: [
+          {name: "id", type: "varchar", length: "32", decimal: "", isNotNull: true, isKey: true, exegesis: "默认主键id"}
+        ]
+      },
+      formDefault: {
+        databaseName: this.$route.query.databaseName,
+        tableName: "",
+        columns: [
+          {name: "id", type: "varchar", length: "32", decimal: "", isNotNull: true, isKey: true, exegesis: "默认主键id"}
+        ]
+      },
+
+    }
+  },
+  mounted() {
+    this.initData();
+  },
+  methods: {
+    initData() {
+      console.log(this.$route.query)
+      const t = this;
+      request({
+        url: "/dataGovernance/tableList?databaseName=" + this.$route.query.databaseName,
+        method: "get"
+      }).then(rs => {
+        t.tableData = rs;
+      })
+    },
+    handleAdd() {
+      this.formVisible = true;
+    },
+    handleAddRow(){
+      this.form.columns.push({name: "", type: "", length: "", decimal: "", isNotNull: false, isKey: false, exegesis: ""})
+    },
+    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) {
+    },
+    change(index, table) {
+    }
+  }
+}
+</script>
+
+<style rel="stylesheet/scss" lang="scss">
+
+.el-table {
+  width: 100%;
+
+  .el-table__header-wrapper table, .el-table__body-wrapper table {
+    width: 100% !important;
+  }
+
+  .el-table__body, .el-table__footer, .el-table__header {
+    table-layout: auto;
+  }
+}
+</style>