Browse Source

可通过 hsweb.app.init-table-excludes 来指定不自动初始化的表

zhouhao 6 years ago
parent
commit
106006cf10

+ 4 - 1
hsweb-starter/hsweb-spring-boot-starter/src/main/java/org/hswebframework/web/starter/AppProperties.java

@@ -22,6 +22,8 @@ import lombok.Getter;
 import lombok.Setter;
 import org.springframework.boot.context.properties.ConfigurationProperties;
 
+import java.util.List;
+
 /**
  * @author zhouhao
  */
@@ -29,7 +31,8 @@ import org.springframework.boot.context.properties.ConfigurationProperties;
 @Getter
 @Setter
 public class AppProperties {
-    private boolean autoInit = true;
+    private boolean      autoInit = true;
+    private List<String> initTableExcludes;
 
     private String name;
     private String comment;

+ 1 - 1
hsweb-starter/hsweb-spring-boot-starter/src/main/java/org/hswebframework/web/starter/SystemInitializeAutoConfiguration.java

@@ -157,7 +157,7 @@ public class SystemInitializeAutoConfiguration implements CommandLineRunner, Bea
 
         initialize.addScriptContext("db", jdbcUserName);
         initialize.addScriptContext("dbType", type.name());
-
+        initialize.setExcludeTables(appProperties.getInitTableExcludes());
         initialize.install();
     }
 

+ 150 - 0
hsweb-starter/hsweb-spring-boot-starter/src/main/java/org/hswebframework/web/starter/init/DoNotingTableBuilder.java

@@ -0,0 +1,150 @@
+package org.hswebframework.web.starter.init;
+
+import lombok.AllArgsConstructor;
+import org.hswebframework.ezorm.rdb.meta.RDBColumnMetaData;
+import org.hswebframework.ezorm.rdb.meta.RDBTableMetaData;
+import org.hswebframework.ezorm.rdb.meta.builder.ColumnBuilder;
+import org.hswebframework.ezorm.rdb.meta.builder.IndexBuilder;
+import org.hswebframework.ezorm.rdb.meta.builder.TableBuilder;
+
+import java.sql.JDBCType;
+import java.util.Set;
+import java.util.function.Consumer;
+
+/**
+ * @author zhouhao
+ * @since 1.0.0
+ */
+public class DoNotingTableBuilder implements TableBuilder {
+
+    @AllArgsConstructor
+    public static class DoNotionColumnBuilder implements ColumnBuilder {
+        private TableBuilder tableBuilder;
+
+        @Override
+        public ColumnBuilder custom(Consumer<RDBColumnMetaData> consumer) {
+            return this;
+        }
+
+        @Override
+        public ColumnBuilder name(String s) {
+            return this;
+        }
+
+        @Override
+        public ColumnBuilder alias(String s) {
+            return this;
+        }
+
+        @Override
+        public ColumnBuilder dataType(String s) {
+            return this;
+        }
+
+        @Override
+        public ColumnBuilder jdbcType(JDBCType jdbcType) {
+            return this;
+        }
+
+        @Override
+        public ColumnBuilder javaType(Class aClass) {
+            return this;
+        }
+
+        @Override
+        public ColumnBuilder comment(String s) {
+            return this;
+        }
+
+        @Override
+        public ColumnBuilder notNull() {
+            return this;
+        }
+
+        @Override
+        public ColumnBuilder primaryKey() {
+            return this;
+        }
+
+        @Override
+        public ColumnBuilder columnDef(String s) {
+            return this;
+        }
+
+        @Override
+        public ColumnBuilder property(String s, Object o) {
+            return this;
+        }
+
+        @Override
+        public ColumnBuilder length(int i) {
+            return this;
+        }
+
+        @Override
+        public ColumnBuilder length(int i, int i1) {
+            return this;
+        }
+
+        @Override
+        public TableBuilder commit() {
+            return tableBuilder;
+        }
+    }
+
+    @Override
+    public TableBuilder addColumn(Set<RDBColumnMetaData> set) {
+        return this;
+    }
+
+    @Override
+    public TableBuilder custom(Consumer<RDBTableMetaData> consumer) {
+        return this;
+    }
+
+    @Override
+    public ColumnBuilder addColumn() {
+        return new DoNotionColumnBuilder(this);
+    }
+
+    @Override
+    public ColumnBuilder addOrAlterColumn(String s) {
+        return new DoNotionColumnBuilder(this);
+    }
+
+    @Override
+    public TableBuilder removeColumn(String s) {
+        return this;
+    }
+
+    @Override
+    public TableBuilder comment(String s) {
+        return this;
+    }
+
+    @Override
+    public TableBuilder property(String s, Object o) {
+        return this;
+    }
+
+    @Override
+    public TableBuilder alias(String s) {
+        return this;
+    }
+
+    @Override
+    public IndexBuilder index() {
+        TableBuilder builder = this;
+        return new IndexBuilder(this, null) {
+            @Override
+            public TableBuilder commit() {
+                return builder;
+            }
+        };
+    }
+
+    @Override
+    public void commit() {
+
+    }
+}

+ 64 - 0
hsweb-starter/hsweb-spring-boot-starter/src/main/java/org/hswebframework/web/starter/init/SkipCreateOrAlterRDBDatabase.java

@@ -0,0 +1,64 @@
+package org.hswebframework.web.starter.init;
+
+import lombok.AllArgsConstructor;
+import org.hswebframework.ezorm.rdb.RDBDatabase;
+import org.hswebframework.ezorm.rdb.RDBTable;
+import org.hswebframework.ezorm.rdb.executor.SqlExecutor;
+import org.hswebframework.ezorm.rdb.meta.RDBDatabaseMetaData;
+import org.hswebframework.ezorm.rdb.meta.RDBTableMetaData;
+import org.hswebframework.ezorm.rdb.meta.builder.TableBuilder;
+import org.hswebframework.ezorm.rdb.meta.builder.simple.SimpleTableBuilder;
+
+import java.sql.SQLException;
+import java.util.List;
+
+/**
+ * @author zhouhao
+ * @since 1.0.0
+ */
+@AllArgsConstructor
+public class SkipCreateOrAlterRDBDatabase implements RDBDatabase {
+    private RDBDatabase target;
+
+    private List<String> excludes;
+
+    private SqlExecutor sqlExecutor;
+
+    @Override
+    public RDBDatabaseMetaData getMeta() {
+        return target.getMeta();
+    }
+
+    @Override
+    public <T> RDBTable<T> getTable(String name) {
+        return target.getTable(name);
+    }
+
+    @Override
+    public <T> RDBTable<T> createTable(RDBTableMetaData tableMetaData) throws SQLException {
+        return target.createTable(tableMetaData);
+    }
+
+    @Override
+    public <T> RDBTable<T> reloadTable(RDBTableMetaData tableMetaData) {
+        return target.reloadTable(tableMetaData);
+    }
+
+    @Override
+    public <T> RDBTable<T> alterTable(RDBTableMetaData tableMetaData) throws SQLException {
+        return target.alterTable(tableMetaData);
+    }
+
+    @Override
+    public boolean removeTable(String name) {
+        return target.removeTable(name);
+    }
+
+    @Override
+    public TableBuilder createOrAlter(String name) {
+        if (excludes.contains(name)) {
+            return new DoNotingTableBuilder();
+        }
+        return target.createOrAlter(name);
+    }
+}

+ 25 - 6
hsweb-starter/hsweb-spring-boot-starter/src/main/java/org/hswebframework/web/starter/init/SystemInitialize.java

@@ -1,5 +1,7 @@
 package org.hswebframework.web.starter.init;
 
+import lombok.Getter;
+import lombok.Setter;
 import org.hswebframework.ezorm.rdb.RDBDatabase;
 import org.hswebframework.ezorm.rdb.RDBTable;
 import org.hswebframework.ezorm.rdb.executor.SqlExecutor;
@@ -14,14 +16,12 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.core.io.Resource;
 import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
+import org.springframework.util.CollectionUtils;
 import org.springframework.util.StreamUtils;
 
 import java.nio.charset.Charset;
 import java.sql.SQLException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.stream.Collectors;
 
 import static org.hswebframework.web.starter.SystemVersion.Property.*;
@@ -42,17 +42,35 @@ public class SystemInitialize {
 
     private List<SimpleDependencyInstaller> readyToInstall;
 
+    @Setter
+    @Getter
+    private List<String> excludeTables;
+
     private String installScriptPath = "classpath*:hsweb-starter.js";
 
     private Map<String, Object> scriptContext = new HashMap<>();
 
+    private boolean initialized = false;
+
+
     public SystemInitialize(SqlExecutor sqlExecutor, RDBDatabase database, SystemVersion targetVersion) {
         this.sqlExecutor = sqlExecutor;
         this.database = database;
         this.targetVersion = targetVersion;
+    }
+
+
+    public void init() {
+        if (initialized) {
+            return;
+        }
+        if (!CollectionUtils.isEmpty(excludeTables)) {
+            this.database = new SkipCreateOrAlterRDBDatabase(database, excludeTables, sqlExecutor);
+        }
         scriptContext.put("sqlExecutor", sqlExecutor);
         scriptContext.put("database", database);
         scriptContext.put("logger", logger);
+        initialized = true;
     }
 
     public void addScriptContext(String var, Object val) {
@@ -73,7 +91,7 @@ public class SystemInitialize {
                 }
             }
 
-            rdbTable.createUpdate().set(targetVersion).where().is("name",targetVersion.getName()).exec();
+            rdbTable.createUpdate().set(targetVersion).where().is("name", targetVersion.getName()).exec();
         }
     }
 
@@ -167,11 +185,12 @@ public class SystemInitialize {
             return;
         }
         RDBTable<SystemVersion> rdbTable = database.getTable("s_system");
-        installed = rdbTable.createQuery().where("name",targetVersion.getName()).single();
+        installed = rdbTable.createQuery().where("name", targetVersion.getName()).single();
     }
 
 
     public void install() throws Exception {
+        init();
         initInstallInfo();
         initReadyToInstallDependencies();
         doInstall();

+ 0 - 2
hsweb-starter/hsweb-spring-boot-starter/src/main/java/org/hswebframework/web/starter/init/simple/SimpleDependencyInstaller.java

@@ -11,8 +11,6 @@ import org.slf4j.LoggerFactory;
 import java.util.Map;
 
 /**
- * TODO 完成注释
- *
  * @author zhouhao
  */
 public class SimpleDependencyInstaller implements DependencyInstaller {

+ 5 - 6
hsweb-starter/hsweb-spring-boot-starter/src/test/java/org/hswebframework/web/starter/InstallTests.java

@@ -38,10 +38,7 @@ import org.slf4j.LoggerFactory;
 import java.sql.Connection;
 import java.sql.DriverManager;
 import java.sql.SQLException;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 /**
  * TODO 完成注释
@@ -51,7 +48,7 @@ import java.util.Map;
 public class InstallTests {
     SqlExecutor sqlExecutor;
     RDBDatabase database;
-    Connection connection;
+    Connection  connection;
 
     @Before
     public void setup() throws Exception {
@@ -87,10 +84,12 @@ public class InstallTests {
         version.setVersion("3.0.0");
         org.hswebframework.web.starter.init.SystemInitialize systemInitialize
                 = new org.hswebframework.web.starter.init.SystemInitialize(sqlExecutor, database, version);
+        systemInitialize.setExcludeTables(Collections.singletonList("s_user_test"));
 
+        systemInitialize.init();
         systemInitialize.install();
 
-      //  List systems = database.getTable("s_system").createQuery().list();
+        //  List systems = database.getTable("s_system").createQuery().list();
         //System.out.println(JSON.toJSONString(systems, SerializerFeature.PrettyFormat));
     }
 

+ 14 - 0
hsweb-starter/hsweb-spring-boot-starter/src/test/resources/hsweb-starter.js

@@ -61,6 +61,20 @@ function install(context) {
         .addColumn().name("creator_id").varchar(32).comment("创建者ID").commit()
         .addColumn().name("create_time").number(32).notNull().comment("创建时间").commit()
         .comment("用户表").commit();
+
+    database.createOrAlter("s_user_test")
+        .addColumn().name("u_id").varchar(32).notNull().primaryKey().comment("uid").commit()
+        .addColumn().name("name").varchar(128).notNull().comment("姓名").commit()
+        .addColumn().name("username").varchar(128).notNull().comment("用户名").commit()
+        .addColumn().name("password").varchar(128).notNull().comment("密码").commit()
+        .addColumn().name("salt").varchar(128).notNull().comment("密码盐").commit()
+        .addColumn().name("status").number(4).notNull().comment("用户状态").commit()
+        .addColumn().name("last_login_ip").varchar(128).comment("上一次登录的ip地址").commit()
+        .addColumn().name("last_login_time").number(32).comment("上一次登录时间").commit()
+        .addColumn().name("creator_id").varchar(32).comment("创建者ID").commit()
+        .addColumn().name("create_time").number(32).notNull().comment("创建时间").commit()
+        .comment("测试用户表").commit();
+
     java.lang.System.out.println("安装了");
 }