From f4c59f64b0b453585c6b94d6f89fc0d30efbeb96 Mon Sep 17 00:00:00 2001 From: root Date: Sat, 31 Jan 2026 05:51:20 +0000 Subject: [PATCH] feat: add inx ordering for tunnel and node --- .../com/admin/common/dto/TunnelDetailDto.java | 7 ++- .../migration/SqliteSchemaMigration.java | 54 +++++++++++++++++++ .../src/main/java/com/admin/entity/Node.java | 14 +++-- .../main/java/com/admin/entity/Tunnel.java | 16 ++++-- .../src/main/resources/schema.sql | 7 +-- 5 files changed, 85 insertions(+), 13 deletions(-) create mode 100644 springboot-backend/src/main/java/com/admin/common/migration/SqliteSchemaMigration.java diff --git a/springboot-backend/src/main/java/com/admin/common/dto/TunnelDetailDto.java b/springboot-backend/src/main/java/com/admin/common/dto/TunnelDetailDto.java index b501654..186387e 100644 --- a/springboot-backend/src/main/java/com/admin/common/dto/TunnelDetailDto.java +++ b/springboot-backend/src/main/java/com/admin/common/dto/TunnelDetailDto.java @@ -14,6 +14,12 @@ import java.util.List; public class TunnelDetailDto { private Long id; + + /** + * Display/order index for drag-sorting in admin UI. + * Lower value appears first. + */ + private Integer inx; private String name; @@ -40,4 +46,3 @@ public class TunnelDetailDto { // 出口节点列表 private List outNodeId = new ArrayList<>(); } - diff --git a/springboot-backend/src/main/java/com/admin/common/migration/SqliteSchemaMigration.java b/springboot-backend/src/main/java/com/admin/common/migration/SqliteSchemaMigration.java new file mode 100644 index 0000000..16d3a05 --- /dev/null +++ b/springboot-backend/src/main/java/com/admin/common/migration/SqliteSchemaMigration.java @@ -0,0 +1,54 @@ +package com.admin.common.migration; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.ApplicationArguments; +import org.springframework.boot.ApplicationRunner; +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Component; + +import java.util.HashSet; +import java.util.Set; + +/** + * Lightweight SQLite schema migration. + * + * Spring Boot SQL init uses CREATE TABLE IF NOT EXISTS, so existing installations + * won't automatically receive new columns. This runner adds missing columns in-place. + */ +@Slf4j +@Component +@Order(Ordered.HIGHEST_PRECEDENCE) +public class SqliteSchemaMigration implements ApplicationRunner { + + private final JdbcTemplate jdbcTemplate; + + public SqliteSchemaMigration(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } + + @Override + public void run(ApplicationArguments args) { + ensureColumn("node", "inx", "INTEGER NOT NULL DEFAULT 0"); + ensureColumn("tunnel", "inx", "INTEGER NOT NULL DEFAULT 0"); + } + + private void ensureColumn(String table, String column, String columnDefinition) { + Set columns = new HashSet<>( + jdbcTemplate.query( + "PRAGMA table_info(" + table + ")", + (rs, rowNum) -> rs.getString("name") + ) + ); + + if (columns.contains(column)) { + return; + } + + log.info("Adding missing column {}.{}", table, column); + jdbcTemplate.execute( + "ALTER TABLE " + table + " ADD COLUMN " + column + " " + columnDefinition + ); + } +} diff --git a/springboot-backend/src/main/java/com/admin/entity/Node.java b/springboot-backend/src/main/java/com/admin/entity/Node.java index b61d6ab..e0aa420 100644 --- a/springboot-backend/src/main/java/com/admin/entity/Node.java +++ b/springboot-backend/src/main/java/com/admin/entity/Node.java @@ -14,7 +14,7 @@ import lombok.EqualsAndHashCode; */ @Data @EqualsAndHashCode(callSuper = true) -public class Node extends BaseEntity { +public class Node extends BaseEntity { private static final long serialVersionUID = 1L; @@ -38,6 +38,12 @@ public class Node extends BaseEntity { private String tcpListenAddr; - private String udpListenAddr; - -} + private String udpListenAddr; + + /** + * Display/order index for drag-sorting in admin UI. + * Lower value appears first. + */ + private Integer inx; + +} diff --git a/springboot-backend/src/main/java/com/admin/entity/Tunnel.java b/springboot-backend/src/main/java/com/admin/entity/Tunnel.java index 1763224..01ff83a 100644 --- a/springboot-backend/src/main/java/com/admin/entity/Tunnel.java +++ b/springboot-backend/src/main/java/com/admin/entity/Tunnel.java @@ -22,7 +22,7 @@ import lombok.EqualsAndHashCode; @Data @EqualsAndHashCode(callSuper = true) @TableName(autoResultMap = true) -public class Tunnel extends BaseEntity { +public class Tunnel extends BaseEntity { private static final long serialVersionUID = 1L; @@ -32,7 +32,13 @@ public class Tunnel extends BaseEntity { private int flow; - private BigDecimal trafficRatio; - - private String inIp; -} + private BigDecimal trafficRatio; + + private String inIp; + + /** + * Display/order index for drag-sorting in admin UI. + * Lower value appears first. + */ + private Integer inx; +} diff --git a/springboot-backend/src/main/resources/schema.sql b/springboot-backend/src/main/resources/schema.sql index 318af77..1e258cb 100644 --- a/springboot-backend/src/main/resources/schema.sql +++ b/springboot-backend/src/main/resources/schema.sql @@ -39,7 +39,8 @@ CREATE TABLE IF NOT EXISTS node ( updated_time INTEGER, status INTEGER NOT NULL, tcp_listen_addr VARCHAR(100) NOT NULL DEFAULT '[::]', - udp_listen_addr VARCHAR(100) NOT NULL DEFAULT '[::]' + udp_listen_addr VARCHAR(100) NOT NULL DEFAULT '[::]', + inx INTEGER NOT NULL DEFAULT 0 ); CREATE TABLE IF NOT EXISTS speed_limit ( @@ -72,7 +73,8 @@ CREATE TABLE IF NOT EXISTS tunnel ( created_time INTEGER NOT NULL, updated_time INTEGER NOT NULL, status INTEGER NOT NULL, - in_ip TEXT + in_ip TEXT, + inx INTEGER NOT NULL DEFAULT 0 ); CREATE TABLE IF NOT EXISTS chain_tunnel ( @@ -123,4 +125,3 @@ CREATE TABLE IF NOT EXISTS vite_config ( value VARCHAR(200) NOT NULL, time INTEGER NOT NULL ); -