From 17bfb2feb4aad12a2f5d49903279c2baf7b44a24 Mon Sep 17 00:00:00 2001 From: FatttSnake Date: Thu, 14 Dec 2023 14:03:09 +0800 Subject: [PATCH] Use flyway to initialize sqlite database --- pom.xml | 9 +- .../top/fatweb/api/FatWebApiApplication.kt | 4 - .../top/fatweb/api/config/FlywayConfig.kt | 43 ++++++++ .../top/fatweb/api/entity/system/SysLog.kt | 4 + .../fatweb/api/properties/FlywayProperties.kt | 95 ++++++++++++++++++ .../service/system/impl/SysLogServiceImpl.kt | 13 ++- src/main/resources/application.yml | 4 +- .../migration/{ => master}/R__Basic_data.sql | 0 .../V1_0_0_231019__Add_table_'t_user'.sql | 0 ...1_0_0_231023__Add_table_'t_power_type'.sql | 0 .../V1_0_0_231024__Add_table_'t_power'.sql | 0 .../V1_0_0_231025__Add_table_'t_menu'.sql | 0 .../V1_0_0_231026__Add_table_'t_func'.sql | 0 ...V1_0_0_231027__Add_table_'t_operation'.sql | 0 .../V1_0_0_231028__Add_table_'t_group'.sql | 0 ...1_0_0_231029__Add_table_'t_user_group'.sql | 0 .../V1_0_0_231030__Add_table_'t_role'.sql | 0 ...1_0_0_231031__Add_table_'t_role_group'.sql | 0 ...V1_0_0_231101__Add_table_'t_user_role'.sql | 0 ...1_0_0_231102__Add_table_'t_power_role'.sql | 0 .../V1_0_0_231103__Add_table_'t_module'.sql | 0 ...V1_0_0_231104__Add_table_'t_user_info'.sql | 0 .../V1_0_0_231212__Add_table_'t_sys_log'.sql | 20 ++++ src/main/resources/db/sqlite.db | Bin 8192 -> 0 bytes 24 files changed, 174 insertions(+), 18 deletions(-) create mode 100644 src/main/kotlin/top/fatweb/api/config/FlywayConfig.kt create mode 100644 src/main/kotlin/top/fatweb/api/properties/FlywayProperties.kt rename src/main/resources/db/migration/{ => master}/R__Basic_data.sql (100%) rename src/main/resources/db/migration/{ => master}/V1_0_0_231019__Add_table_'t_user'.sql (100%) rename src/main/resources/db/migration/{ => master}/V1_0_0_231023__Add_table_'t_power_type'.sql (100%) rename src/main/resources/db/migration/{ => master}/V1_0_0_231024__Add_table_'t_power'.sql (100%) rename src/main/resources/db/migration/{ => master}/V1_0_0_231025__Add_table_'t_menu'.sql (100%) rename src/main/resources/db/migration/{ => master}/V1_0_0_231026__Add_table_'t_func'.sql (100%) rename src/main/resources/db/migration/{ => master}/V1_0_0_231027__Add_table_'t_operation'.sql (100%) rename src/main/resources/db/migration/{ => master}/V1_0_0_231028__Add_table_'t_group'.sql (100%) rename src/main/resources/db/migration/{ => master}/V1_0_0_231029__Add_table_'t_user_group'.sql (100%) rename src/main/resources/db/migration/{ => master}/V1_0_0_231030__Add_table_'t_role'.sql (100%) rename src/main/resources/db/migration/{ => master}/V1_0_0_231031__Add_table_'t_role_group'.sql (100%) rename src/main/resources/db/migration/{ => master}/V1_0_0_231101__Add_table_'t_user_role'.sql (100%) rename src/main/resources/db/migration/{ => master}/V1_0_0_231102__Add_table_'t_power_role'.sql (100%) rename src/main/resources/db/migration/{ => master}/V1_0_0_231103__Add_table_'t_module'.sql (100%) rename src/main/resources/db/migration/{ => master}/V1_0_0_231104__Add_table_'t_user_info'.sql (100%) create mode 100644 src/main/resources/db/migration/sqlite/V1_0_0_231212__Add_table_'t_sys_log'.sql delete mode 100644 src/main/resources/db/sqlite.db diff --git a/pom.xml b/pom.xml index 096f298..4ab8946 100644 --- a/pom.xml +++ b/pom.xml @@ -147,7 +147,7 @@ com.baomidou - mybatis-plus-boot-starter + mybatis-plus-spring-boot3-starter 3.5.4.1 @@ -160,11 +160,6 @@ dynamic-datasource-spring-boot3-starter 4.2.0 - - org.flywaydb - flyway-core - ${flyway.version} - org.flywaydb flyway-mysql @@ -176,7 +171,7 @@ com.baomidou - mybatis-plus-boot-starter-test + mybatis-plus-spring-boot3-starter-test 3.5.4.1 test diff --git a/src/main/kotlin/top/fatweb/api/FatWebApiApplication.kt b/src/main/kotlin/top/fatweb/api/FatWebApiApplication.kt index 8f06f1f..9a5f335 100644 --- a/src/main/kotlin/top/fatweb/api/FatWebApiApplication.kt +++ b/src/main/kotlin/top/fatweb/api/FatWebApiApplication.kt @@ -48,10 +48,6 @@ fun main(args: Array) { if (File("data/db/sqlite.db").exists() && !File("data/db/sqlite.db").delete()) { logger.error("Can not recreate database 'data/db/sqlite.db', please try again later.") } - - FatWebApiApplication::class.java.getResourceAsStream("/db/sqlite.db")?.let { - File("data/db/sqlite.db").writeBytes(it.readAllBytes()) - } } if (File("application-config.yml").exists() || File("data/application-config.yml").exists()) { diff --git a/src/main/kotlin/top/fatweb/api/config/FlywayConfig.kt b/src/main/kotlin/top/fatweb/api/config/FlywayConfig.kt new file mode 100644 index 0000000..824b529 --- /dev/null +++ b/src/main/kotlin/top/fatweb/api/config/FlywayConfig.kt @@ -0,0 +1,43 @@ +package top.fatweb.api.config + +import com.baomidou.dynamic.datasource.DynamicRoutingDataSource +import jakarta.annotation.PostConstruct +import org.flywaydb.core.Flyway +import org.springframework.context.annotation.Configuration +import org.springframework.context.annotation.DependsOn +import top.fatweb.api.properties.FlywayProperties +import javax.sql.DataSource + +/** + * Flyway configuration + * + * @author FatttSnake, fatttsnake@gmail.com + * @since 1.0.0 + */ +@DependsOn("flywayProperties") +@Configuration +class FlywayConfig( + private val dataSource: DataSource +) { + @PostConstruct + fun migrateOrder() { + val ds = dataSource as DynamicRoutingDataSource + ds.dataSources.forEach { (k: String, v: DataSource?) -> + val flyway = Flyway.configure() + .dataSource(v) + .locations(*FlywayProperties.locations.map { "$it/$k" }.toTypedArray()) + .baselineOnMigrate(FlywayProperties.baselineOnMigrate) + .table(FlywayProperties.table) + .outOfOrder(FlywayProperties.outOfOrder) + .validateOnMigrate(FlywayProperties.validateOnMigrate) + .encoding(FlywayProperties.encoding) + .sqlMigrationPrefix(FlywayProperties.sqlMigrationPrefix) + .sqlMigrationSeparator(FlywayProperties.sqlMigrationSeparator) + .sqlMigrationSuffixes(*FlywayProperties.sqlMigrationSuffixes.toTypedArray()) + .baselineVersion(FlywayProperties.baselineVersion) + .load() + flyway.migrate() + } + + } +} \ No newline at end of file diff --git a/src/main/kotlin/top/fatweb/api/entity/system/SysLog.kt b/src/main/kotlin/top/fatweb/api/entity/system/SysLog.kt index 4928382..7ab85a0 100644 --- a/src/main/kotlin/top/fatweb/api/entity/system/SysLog.kt +++ b/src/main/kotlin/top/fatweb/api/entity/system/SysLog.kt @@ -3,6 +3,7 @@ package top.fatweb.api.entity.system import com.baomidou.mybatisplus.annotation.TableField import com.baomidou.mybatisplus.annotation.TableId import com.baomidou.mybatisplus.annotation.TableName +import com.fasterxml.jackson.annotation.JsonFormat import java.io.Serializable import java.time.LocalDateTime @@ -48,6 +49,7 @@ class SysLog : Serializable { * @since 1.0.0 * @see LocalDateTime */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss.SSS") @TableField("operate_time") var operateTime: LocalDateTime? = null @@ -121,6 +123,7 @@ class SysLog : Serializable { * @since 1.0.0 * @see LocalDateTime */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss.SSS") @TableField("start_time") var startTime: LocalDateTime? = null @@ -131,6 +134,7 @@ class SysLog : Serializable { * @since 1.0.0 * @see LocalDateTime */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss.SSS") @TableField("end_time") var endTime: LocalDateTime? = null diff --git a/src/main/kotlin/top/fatweb/api/properties/FlywayProperties.kt b/src/main/kotlin/top/fatweb/api/properties/FlywayProperties.kt new file mode 100644 index 0000000..9a2a31e --- /dev/null +++ b/src/main/kotlin/top/fatweb/api/properties/FlywayProperties.kt @@ -0,0 +1,95 @@ +package top.fatweb.api.properties + +import org.springframework.boot.context.properties.ConfigurationProperties +import org.springframework.stereotype.Component + +/** + * Flyway properties + * + * @author FatttSnake, fatttsnake@gmail.com + * @since 1.0.0 + */ +@Component +@ConfigurationProperties("spring.flyway") +object FlywayProperties { + /** + * Locations of migrations scripts. Can contain the special "{vendor}" placeholder to + * use vendor-specific locations. + * + * @author FatttSnake, fatttsnake@gmail.com + * @since 1.0.0 + */ + var locations = listOf("classpath:db/migration") + + /** + * Name of the schema history table that will be used by Flyway. + * + * @author FatttSnake, fatttsnake@gmail.com + * @since 1.0.0 + */ + var table = "flyway_schema_history" + + /** + * Whether to allow migrations to be run out of order. + * + * @author FatttSnake, fatttsnake@gmail.com + * @since 1.0.0 + */ + var outOfOrder = false + + /** + * Whether to automatically call validate when performing a migration. + * + * @author FatttSnake, fatttsnake@gmail.com + * @since 1.0.0 + */ + var validateOnMigrate = true + + /** + * Encoding of SQL migrations. + * + * @author FatttSnake, fatttsnake@gmail.com + * @since 1.0.0 + */ + var encoding = Charsets.UTF_8 + + /** + * File name prefix for SQL migrations. + * + * @author FatttSnake, fatttsnake@gmail.com + * @since 1.0.0 + */ + var sqlMigrationPrefix = "V" + + /** + * File name separator for SQL migrations. + * + * @author FatttSnake, fatttsnake@gmail.com + * @since 1.0.0 + */ + var sqlMigrationSeparator = "__" + + /** + * File name suffix for SQL migrations. + * + * @author FatttSnake, fatttsnake@gmail.com + * @since 1.0.0 + */ + var sqlMigrationSuffixes = listOf(".sql") + + /** + * Whether to automatically call baseline when migrating a non-empty schema. + * + * @author FatttSnake, fatttsnake@gmail.com + * @since 1.0.0 + */ + var baselineOnMigrate = true + + /** + * Version to tag an existing schema with when executing baseline. + * + * @author FatttSnake, fatttsnake@gmail.com + * @since 1.0.0 + */ + var baselineVersion = "0" +} \ No newline at end of file diff --git a/src/main/kotlin/top/fatweb/api/service/system/impl/SysLogServiceImpl.kt b/src/main/kotlin/top/fatweb/api/service/system/impl/SysLogServiceImpl.kt index 1cfd886..6f596a9 100644 --- a/src/main/kotlin/top/fatweb/api/service/system/impl/SysLogServiceImpl.kt +++ b/src/main/kotlin/top/fatweb/api/service/system/impl/SysLogServiceImpl.kt @@ -49,11 +49,14 @@ class SysLogServiceImpl( it.operateUsername = it.operateUserId?.let { it1 -> userService.getOne(it1)?.username } } - val userIds = sysLogIPage.records.map { it.operateUserId } - userService.list(KtQueryWrapper(User()).select(User::id, User::username).`in`(User::id, userIds)).forEach { user -> - sysLogIPage.records.forEach { - if (it.operateUserId == user.id) { - it.operateUsername = user.username + if (sysLogIPage.records.isNotEmpty()) { + val userIds = sysLogIPage.records.map { it.operateUserId } + + userService.list(KtQueryWrapper(User()).select(User::id, User::username).`in`(User::id, userIds)).forEach { user -> + sysLogIPage.records.forEach { + if (it.operateUserId == user.id) { + it.operateUsername = user.username + } } } } diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index f0dbc7f..3117780 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -17,16 +17,16 @@ spring: sqlite: type: com.zaxxer.hikari.HikariDataSource driver-class-name: org.sqlite.JDBC - url: jdbc:sqlite:data/db/sqlite.db?date_string_format=yyyy-MM-dd'T'HH:mm:ss.SSS + url: jdbc:sqlite:data/db/sqlite.db jackson: date-format: yyyy-MM-dd'T'HH:mm:ss.SSS'Z' time-zone: GMT flyway: + enabled: false baseline-on-migrate: true baseline-version: 0 - clean-disabled: false mybatis-plus: global-config: diff --git a/src/main/resources/db/migration/R__Basic_data.sql b/src/main/resources/db/migration/master/R__Basic_data.sql similarity index 100% rename from src/main/resources/db/migration/R__Basic_data.sql rename to src/main/resources/db/migration/master/R__Basic_data.sql diff --git a/src/main/resources/db/migration/V1_0_0_231019__Add_table_'t_user'.sql b/src/main/resources/db/migration/master/V1_0_0_231019__Add_table_'t_user'.sql similarity index 100% rename from src/main/resources/db/migration/V1_0_0_231019__Add_table_'t_user'.sql rename to src/main/resources/db/migration/master/V1_0_0_231019__Add_table_'t_user'.sql diff --git a/src/main/resources/db/migration/V1_0_0_231023__Add_table_'t_power_type'.sql b/src/main/resources/db/migration/master/V1_0_0_231023__Add_table_'t_power_type'.sql similarity index 100% rename from src/main/resources/db/migration/V1_0_0_231023__Add_table_'t_power_type'.sql rename to src/main/resources/db/migration/master/V1_0_0_231023__Add_table_'t_power_type'.sql diff --git a/src/main/resources/db/migration/V1_0_0_231024__Add_table_'t_power'.sql b/src/main/resources/db/migration/master/V1_0_0_231024__Add_table_'t_power'.sql similarity index 100% rename from src/main/resources/db/migration/V1_0_0_231024__Add_table_'t_power'.sql rename to src/main/resources/db/migration/master/V1_0_0_231024__Add_table_'t_power'.sql diff --git a/src/main/resources/db/migration/V1_0_0_231025__Add_table_'t_menu'.sql b/src/main/resources/db/migration/master/V1_0_0_231025__Add_table_'t_menu'.sql similarity index 100% rename from src/main/resources/db/migration/V1_0_0_231025__Add_table_'t_menu'.sql rename to src/main/resources/db/migration/master/V1_0_0_231025__Add_table_'t_menu'.sql diff --git a/src/main/resources/db/migration/V1_0_0_231026__Add_table_'t_func'.sql b/src/main/resources/db/migration/master/V1_0_0_231026__Add_table_'t_func'.sql similarity index 100% rename from src/main/resources/db/migration/V1_0_0_231026__Add_table_'t_func'.sql rename to src/main/resources/db/migration/master/V1_0_0_231026__Add_table_'t_func'.sql diff --git a/src/main/resources/db/migration/V1_0_0_231027__Add_table_'t_operation'.sql b/src/main/resources/db/migration/master/V1_0_0_231027__Add_table_'t_operation'.sql similarity index 100% rename from src/main/resources/db/migration/V1_0_0_231027__Add_table_'t_operation'.sql rename to src/main/resources/db/migration/master/V1_0_0_231027__Add_table_'t_operation'.sql diff --git a/src/main/resources/db/migration/V1_0_0_231028__Add_table_'t_group'.sql b/src/main/resources/db/migration/master/V1_0_0_231028__Add_table_'t_group'.sql similarity index 100% rename from src/main/resources/db/migration/V1_0_0_231028__Add_table_'t_group'.sql rename to src/main/resources/db/migration/master/V1_0_0_231028__Add_table_'t_group'.sql diff --git a/src/main/resources/db/migration/V1_0_0_231029__Add_table_'t_user_group'.sql b/src/main/resources/db/migration/master/V1_0_0_231029__Add_table_'t_user_group'.sql similarity index 100% rename from src/main/resources/db/migration/V1_0_0_231029__Add_table_'t_user_group'.sql rename to src/main/resources/db/migration/master/V1_0_0_231029__Add_table_'t_user_group'.sql diff --git a/src/main/resources/db/migration/V1_0_0_231030__Add_table_'t_role'.sql b/src/main/resources/db/migration/master/V1_0_0_231030__Add_table_'t_role'.sql similarity index 100% rename from src/main/resources/db/migration/V1_0_0_231030__Add_table_'t_role'.sql rename to src/main/resources/db/migration/master/V1_0_0_231030__Add_table_'t_role'.sql diff --git a/src/main/resources/db/migration/V1_0_0_231031__Add_table_'t_role_group'.sql b/src/main/resources/db/migration/master/V1_0_0_231031__Add_table_'t_role_group'.sql similarity index 100% rename from src/main/resources/db/migration/V1_0_0_231031__Add_table_'t_role_group'.sql rename to src/main/resources/db/migration/master/V1_0_0_231031__Add_table_'t_role_group'.sql diff --git a/src/main/resources/db/migration/V1_0_0_231101__Add_table_'t_user_role'.sql b/src/main/resources/db/migration/master/V1_0_0_231101__Add_table_'t_user_role'.sql similarity index 100% rename from src/main/resources/db/migration/V1_0_0_231101__Add_table_'t_user_role'.sql rename to src/main/resources/db/migration/master/V1_0_0_231101__Add_table_'t_user_role'.sql diff --git a/src/main/resources/db/migration/V1_0_0_231102__Add_table_'t_power_role'.sql b/src/main/resources/db/migration/master/V1_0_0_231102__Add_table_'t_power_role'.sql similarity index 100% rename from src/main/resources/db/migration/V1_0_0_231102__Add_table_'t_power_role'.sql rename to src/main/resources/db/migration/master/V1_0_0_231102__Add_table_'t_power_role'.sql diff --git a/src/main/resources/db/migration/V1_0_0_231103__Add_table_'t_module'.sql b/src/main/resources/db/migration/master/V1_0_0_231103__Add_table_'t_module'.sql similarity index 100% rename from src/main/resources/db/migration/V1_0_0_231103__Add_table_'t_module'.sql rename to src/main/resources/db/migration/master/V1_0_0_231103__Add_table_'t_module'.sql diff --git a/src/main/resources/db/migration/V1_0_0_231104__Add_table_'t_user_info'.sql b/src/main/resources/db/migration/master/V1_0_0_231104__Add_table_'t_user_info'.sql similarity index 100% rename from src/main/resources/db/migration/V1_0_0_231104__Add_table_'t_user_info'.sql rename to src/main/resources/db/migration/master/V1_0_0_231104__Add_table_'t_user_info'.sql diff --git a/src/main/resources/db/migration/sqlite/V1_0_0_231212__Add_table_'t_sys_log'.sql b/src/main/resources/db/migration/sqlite/V1_0_0_231212__Add_table_'t_sys_log'.sql new file mode 100644 index 0000000..93c1301 --- /dev/null +++ b/src/main/resources/db/migration/sqlite/V1_0_0_231212__Add_table_'t_sys_log'.sql @@ -0,0 +1,20 @@ +drop table if exists t_sys_log; + +create table t_sys_log -- 系统日志表 +( + id bigint not null, + log_type varchar(50) not null, -- 日志类型 + operate_user_id bigint not null, -- 操作用户 + operate_time datetime not null default (strftime('%Y-%m-%d %H:%M:%f','now')), -- 操作时间 + request_uri varchar(500) default null, -- 请求 URI + request_method varchar(10) default null, -- 请求方式 + request_params text, -- 请求参数 + request_ip varchar(20) not null, -- 请求 IP + request_server_address varchar(50) not null, -- 请求服务器地址 + exception int not null default 0, -- 是否异常 + exception_info text, -- 异常信息 + start_time datetime not null, -- 开始时间 + end_time datetime not null, -- 结束时间 + execute_time bigint default null, -- 执行时间 + user_agent varchar(500) default null -- 用户代理 +); \ No newline at end of file diff --git a/src/main/resources/db/sqlite.db b/src/main/resources/db/sqlite.db deleted file mode 100644 index c4467bb2003fe03fecd217607f90a61d35e92148..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8192 zcmeH~?`zXQ7{`+#2!*2We7SoQ+CnSS;hVj3%D}+{o%4k+BxKFC3$#g1F0*?#`$E(@ zHkhsool->Ccim82rIr0Ny`=sZUV6*rN5`gnIqsop?ykxA`Sz3N9>}AI3mSr;V3=hE zfob8YAd13m00co0$uU6=KfL)Re?rdQ{Hzd#>v}gyt`ZYZ1@hs+32*|O04Kl+Z~~kF zCvcGo)PZ>U+T^6Ta|J2OC5U8e&5}z-kqsv9F3!y^&4H!aI}3AwErVPRxZitj@3YhR zijNw@Ry&zUCli2#rh4CFv8)v}9nodoKtQ)kr7XRJB$Uxw1;*}KRm}W~Vy16RWdOS) zc1?InJW)69K@WebQ*EOHO$9;OwxB5o)=qR27K@EN?d^@h@22~%?YugSY9p;2_O6nA z-coux@C{U0Q0x){X$zT!(XT1#Nlq%~Bo#>aW~BQwQX!R1>BjR^CX@B}(tJ+i=by$8 zn$LvKY-l0bHnp(5fD-}bho5hR*d?O^x{>f>| z&dx8~-;8Qk6jLc%%nE{4lx4HC2h26ztU2%ZquN>}BH;VJ`R|o;Ol1B+RG3uFDk&UA zRZVDFz!(0HlBB{;a|6F=;g41UPJk2O1ULasfD_;ZH~~(86S%+x{sNbS Bu08+&