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 c4467bb..0000000
Binary files a/src/main/resources/db/sqlite.db and /dev/null differ