From dc7b6eb1529e4c584888a274a473ea0c97b2bf33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=92=9F=E6=99=BA=E5=BC=BA?= Date: Fri, 30 May 2025 15:28:10 +0800 Subject: [PATCH 1/6] =?UTF-8?q?feat(=E6=95=B0=E6=8D=AE=E5=BA=93):=20?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=A4=9A=E6=95=B0=E6=8D=AE=E5=BA=93=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 引入 Database 枚举类定义支持的数据库类型 修改 Configuration 类添加数据库模式配置 更新 DatabaseController 根据配置选择不同数据库连接方式 #2 --- .../xin/ctkqiang/config/Configuration.java | 12 +++++ .../controller/DatabaseController.java | 48 ++++++++++++++----- src/main/java/xin/ctkqiang/dto/Database.java | 26 ++++++++++ 3 files changed, 75 insertions(+), 11 deletions(-) create mode 100644 src/main/java/xin/ctkqiang/dto/Database.java diff --git a/src/main/java/xin/ctkqiang/config/Configuration.java b/src/main/java/xin/ctkqiang/config/Configuration.java index b87fd99..a408efc 100644 --- a/src/main/java/xin/ctkqiang/config/Configuration.java +++ b/src/main/java/xin/ctkqiang/config/Configuration.java @@ -1,6 +1,10 @@ package xin.ctkqiang.config; +import xin.ctkqiang.dto.Database; + public class Configuration { + public String DatabaseMode; + public static final String DB_NAME = "ExploitDB"; public static final String DB_URL = "jdbc:mysql://localhost:3306/" + DB_NAME + "?serverTimezone=UTC&allowPublicKeyRetrieval=true&useSSL=false"; @@ -10,4 +14,12 @@ public class Configuration { public static final String DB_DRIVER = "com.mysql.cj.jdbc.Driver"; public static final boolean DEBUG = false; + + public String getDatabaseMode() { + return this.DatabaseMode; + } + + public void setDatabaseMode(Database databaseMode) { + this.DatabaseMode = databaseMode.getValue(); + } } diff --git a/src/main/java/xin/ctkqiang/controller/DatabaseController.java b/src/main/java/xin/ctkqiang/controller/DatabaseController.java index d3a9bb5..7a7aeaf 100644 --- a/src/main/java/xin/ctkqiang/controller/DatabaseController.java +++ b/src/main/java/xin/ctkqiang/controller/DatabaseController.java @@ -18,6 +18,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import xin.ctkqiang.config.Configuration; +import xin.ctkqiang.dto.Database; import xin.ctkqiang.dto.Exploit; /** @@ -44,6 +45,8 @@ public class DatabaseController { /** 数据库驱动类名 */ protected final static String DB_DRIVER = Configuration.DB_DRIVER; + private Configuration Config; + /** * 静态初始化块 * 在类加载时尝试加载数据库驱动 @@ -109,18 +112,41 @@ public void CreateTableIfNotExists() { + ");"; try { - // 确保数据库驱动已加载 - Class.forName(DatabaseController.DB_DRIVER); - - // 创建数据库连接并执行建表语句 - try (Connection conn = DriverManager.getConnection( - DatabaseController.DB_URL, - DatabaseController.DB_USER, - DatabaseController.DB_PASSWORD); - Statement stmt = conn.createStatement()) { - stmt.execute(query); - System.out.println("💾 数据表【内容信息】初始化成功!"); + + String mode = this.Config.getDatabaseMode(); + Database dbMode; + + try { + dbMode = Database.fromValue(mode); + } catch (IllegalArgumentException e) { + dbMode = null; } + + if (dbMode == null) { + System.out.println("⚠️ Unknown database mode: " + mode); + return; + } + + switch (dbMode) { + case SQLITE: + System.out.println("📦 Connect to SQLite database"); + break; + case MYSQL: + default: + // 确保数据库驱动已加载 + Class.forName(DatabaseController.DB_DRIVER); + + // 创建数据库连接并执行建表语句 + try (Connection conn = DriverManager.getConnection( + DatabaseController.DB_URL, + DatabaseController.DB_USER, + DatabaseController.DB_PASSWORD); + Statement stmt = conn.createStatement()) { + stmt.execute(query); + System.out.println("💾 数据表【内容信息】初始化成功!"); + } + } + } catch (Exception e) { System.err.println("❌ 数据表创建失败:" + e.getMessage()); e.printStackTrace(); diff --git a/src/main/java/xin/ctkqiang/dto/Database.java b/src/main/java/xin/ctkqiang/dto/Database.java new file mode 100644 index 0000000..ae21a40 --- /dev/null +++ b/src/main/java/xin/ctkqiang/dto/Database.java @@ -0,0 +1,26 @@ +package xin.ctkqiang.dto; + +public enum Database { + MYSQL("MySQL"), + SQLITE("SQLite"); + + private final String value; + + Database(String value) { + this.value = value; + } + + public String getValue() { + return value; + } + + // 可选: 根据字符串反查 enum(比如传入 "MySQL" 返回 MYSQL 枚举值) + public static Database fromValue(String value) { + for (Database db : values()) { + if (db.value.equalsIgnoreCase(value)) { + return db; + } + } + throw new IllegalArgumentException("Unknown database type: " + value); + } +} From f419728a15333cf9543fd3ba0c3d6c0e6969bb92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=92=9F=E6=99=BA=E5=BC=BA?= Date: Fri, 30 May 2025 15:42:41 +0800 Subject: [PATCH 2/6] =?UTF-8?q?feat(database):=20=E6=B7=BB=E5=8A=A0SQLite?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=BA=93=E6=94=AF=E6=8C=81=E5=B9=B6=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E6=95=B0=E6=8D=AE=E5=BA=93=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在pom.xml中添加SQLite JDBC依赖 - 在Configuration类中添加SQLite数据库URL常量 - 修改DatabaseController以支持SQLite数据库连接和初始化 - 更新Main类添加数据库模式配置选项 - 添加release.sh脚本用于项目构建和发布 - 移除Database枚举类中多余的注释 这些修改使得项目能够支持SQLite轻量级数据库作为MySQL的替代方案,同时改进了数据库相关的错误提示和用户体验。 #2 --- pom.xml | 7 ++ scripts/release.sh | 73 +++++++++++++++++++ src/main/java/xin/ctkqiang/Main.java | 18 +++++ .../xin/ctkqiang/config/Configuration.java | 2 + .../controller/DatabaseController.java | 22 ++++-- src/main/java/xin/ctkqiang/dto/Database.java | 1 - 6 files changed, 117 insertions(+), 6 deletions(-) create mode 100644 scripts/release.sh diff --git a/pom.xml b/pom.xml index 8327b14..72ab366 100644 --- a/pom.xml +++ b/pom.xml @@ -55,6 +55,13 @@ runtime + + org.xerial + sqlite-jdbc + 3.45.2.0 + + + com.fasterxml.jackson.core diff --git a/scripts/release.sh b/scripts/release.sh new file mode 100644 index 0000000..4db3525 --- /dev/null +++ b/scripts/release.sh @@ -0,0 +1,73 @@ +#!/bin/bash + +APP_NAME="ExploitDB" +MAIN_CLASS="xin.ctkqiang.Main" +VERSION="v1.0.0" +RELEASE_DIR="releases/${VERSION}" +OUT_DIR="out" + +# 彩色 ASCII 标题(纯 echo) +ascii_banner() { + echo " _____ _ _ _ _ _ " + echo " | ____|_ ___ __ | | ___ (_) |_(_)___| |_ ___ _ __ " + echo " | _| \ \/ / '_ \| |/ _ \| | __| / __| __/ _ \| '__|" + echo " | |___ > <| |_) | | (_) | | |_| \__ \ || (_) | | " + echo " |_____/_/\_\ .__/|_|\___/|_|\__|_|___/\__\___/|_| " + echo " |_| " +} + +# 动画函数 +wait_animation() { + local MESSAGE=$1 + local DOTS="" + + echo "$MESSAGE" + for i in 1 2 3; do + DOTS="$DOTS." + echo "$DOTS" + sleep 0.3 + done +} + +# 步骤开始 +ascii_banner +wait_animation "🌸 灵儿正在为你编译 Java 11 项目" + +# 清理旧文件 +rm -rf $OUT_DIR $RELEASE_DIR +mkdir -p $OUT_DIR + +# 编译 +find ./src -name "*.java" >sources.txt +javac -source 11 -target 11 -d $OUT_DIR @sources.txt + +if [ $? -ne 0 ]; then + echo "❌ 编译失败了!检查一下语法哦~" + exit 1 +fi + +wait_animation "🎀 编译完成,开始打包成 JAR" + +# 创建 JAR 包 +JAR_NAME="${APP_NAME}-${VERSION}.jar" +jar cfe $JAR_NAME $MAIN_CLASS -C $OUT_DIR . + +if [ $? -ne 0 ]; then + echo "❌ 打包失败了!可能是入口类路径设置错了~" + exit 1 +fi + +# 准备 Release 目录 +mkdir -p $RELEASE_DIR +mv $JAR_NAME $RELEASE_DIR/ + +wait_animation "📦 发布结构整理完成" + +# Release Summary +echo "" +echo "🎉 Release 打包成功!少女完成度 100%~" +echo "📁 输出目录: $RELEASE_DIR" +echo "📦 文件名: $JAR_NAME" +echo "🔮 Java 版本: $(java -version 2>&1 | head -n 1)" +echo "" +echo "下一步:上传 GitHub Release 页面吧 💖" diff --git a/src/main/java/xin/ctkqiang/Main.java b/src/main/java/xin/ctkqiang/Main.java index 559c4f1..bee54f1 100644 --- a/src/main/java/xin/ctkqiang/Main.java +++ b/src/main/java/xin/ctkqiang/Main.java @@ -4,8 +4,10 @@ import java.util.List; import java.util.Scanner; +import xin.ctkqiang.config.Configuration; import xin.ctkqiang.controller.ExploitDbController; import xin.ctkqiang.controller.UserUtil; +import xin.ctkqiang.dto.Database; public class Main { public static final String VERSION = "1.0"; @@ -23,6 +25,8 @@ public class Main { private static List allowed = Arrays.asList("csv", "json", "sql"); + private static Configuration Config; + private static void PrintBanner() { System.out.println("==================================="); System.out.println(" " + TITLE + " v" + VERSION); @@ -35,6 +39,20 @@ public static void main(String[] args) { try { Main.PrintBanner(); + /** + * 设置数据库模式 ♡ + * 可选值请查阅 {@link xin.ctkqiang.dto.Database Database} 枚举类: + *
    + *
  • {@link xin.ctkqiang.dto.Database#MYSQL MYSQL} :标准的 MySQL 数据库
  • + *
  • {@link xin.ctkqiang.dto.Database#SQLite SQLite} :轻量级嵌入式数据库
  • + *
+ * 如果想用 SQLite,就把这里改成 {@link xin.ctkqiang.dto.Database#SQLite Database.SQLITE} + * 哦~ ✨🤭⚡️🌸🌸🌸 + */ + + // Main.Config.setDatabaseMode(Database.MYSQL); + Main.Config.setDatabaseMode(Database.SQLITE); + int pages = userUtil.askForPositiveInt("📄 想爬多少页咧~?(建议填个50以上更爽!):"); boolean isExport = userUtil.askForYesNo("💾 要不要顺便导出数据嘞?(支持 .csv/.json/.sql哦)✨:"); diff --git a/src/main/java/xin/ctkqiang/config/Configuration.java b/src/main/java/xin/ctkqiang/config/Configuration.java index a408efc..e54dd05 100644 --- a/src/main/java/xin/ctkqiang/config/Configuration.java +++ b/src/main/java/xin/ctkqiang/config/Configuration.java @@ -9,6 +9,8 @@ public class Configuration { public static final String DB_URL = "jdbc:mysql://localhost:3306/" + DB_NAME + "?serverTimezone=UTC&allowPublicKeyRetrieval=true&useSSL=false"; + public static final String DB_SQLITE_URL = "jdbc:sqlite:ling.sqlite"; + public static final String DB_USER = "root"; // 改成你的数据库用户名 public static final String DB_PASSWORD = ""; // 改成你的数据库密码 public static final String DB_DRIVER = "com.mysql.cj.jdbc.Driver"; diff --git a/src/main/java/xin/ctkqiang/controller/DatabaseController.java b/src/main/java/xin/ctkqiang/controller/DatabaseController.java index 7a7aeaf..49e69c2 100644 --- a/src/main/java/xin/ctkqiang/controller/DatabaseController.java +++ b/src/main/java/xin/ctkqiang/controller/DatabaseController.java @@ -33,7 +33,7 @@ public class DatabaseController { /** 数据库名称 */ protected final static String DB_NAME = Configuration.DB_NAME; - /** 数据库连接URL */ + /** MYSQL 数据库连接URL */ protected final static String DB_URL = Configuration.DB_URL; /** 数据库用户名 */ @@ -45,6 +45,9 @@ public class DatabaseController { /** 数据库驱动类名 */ protected final static String DB_DRIVER = Configuration.DB_DRIVER; + /** SQLITE 数据库连接URL */ + protected final static String DB_SQLITE_URL = Configuration.DB_SQLITE_URL; + private Configuration Config; /** @@ -123,13 +126,22 @@ public void CreateTableIfNotExists() { } if (dbMode == null) { - System.out.println("⚠️ Unknown database mode: " + mode); + System.out.println("🥴 吃嗯的!这个数据库模式不认识喔:\"" + mode + "\" 妹妹我拒绝连接!"); return; } switch (dbMode) { case SQLITE: - System.out.println("📦 Connect to SQLite database"); + // 加载 SQLite JDBC 驱动 + Class.forName("org.sqlite.JDBC"); + + // 构建连接(数据库文件叫 ling.sqlite) + try (Connection conn = DriverManager.getConnection(DatabaseController.DB_SQLITE_URL); + Statement stmt = conn.createStatement()) { + stmt.execute(query); + System.out.println("🎀 SQLite 模式下,表结构初始化好啦!已经准备好可爱的记录了喵~"); + } + break; case MYSQL: default: @@ -143,12 +155,12 @@ public void CreateTableIfNotExists() { DatabaseController.DB_PASSWORD); Statement stmt = conn.createStatement()) { stmt.execute(query); - System.out.println("💾 数据表【内容信息】初始化成功!"); + System.out.println("💾 MySQL 模式下,数据表【内容信息】初始化成功~♡"); } } } catch (Exception e) { - System.err.println("❌ 数据表创建失败:" + e.getMessage()); + System.err.println("❌ 表创建失败惹呜呜呜呜:妹抖崩坏 > <\n" + e.getMessage()); e.printStackTrace(); } } diff --git a/src/main/java/xin/ctkqiang/dto/Database.java b/src/main/java/xin/ctkqiang/dto/Database.java index ae21a40..dd3429f 100644 --- a/src/main/java/xin/ctkqiang/dto/Database.java +++ b/src/main/java/xin/ctkqiang/dto/Database.java @@ -14,7 +14,6 @@ public String getValue() { return value; } - // 可选: 根据字符串反查 enum(比如传入 "MySQL" 返回 MYSQL 枚举值) public static Database fromValue(String value) { for (Database db : values()) { if (db.value.equalsIgnoreCase(value)) { From d5dda7670bfdc787dd21f4b312c84481285634e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=92=9F=E6=99=BA=E5=BC=BA?= Date: Fri, 30 May 2025 16:01:11 +0800 Subject: [PATCH 3/6] =?UTF-8?q?style:=20=E4=BC=98=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E6=A0=BC=E5=BC=8F=E5=92=8C=E7=95=8C=E9=9D=A2=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E9=A3=8E=E6=A0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 初始化 Configuration 对象避免空指针 - 在用户输入提示中添加表情符号增强交互体验 - 为数据库模式设置默认值并添加设置成功的提示信息 - 重写欢迎横幅使其更加生动可爱 - 统一代码中的分号使用 #2 --- src/main/java/xin/ctkqiang/Main.java | 24 +++++++++++++------ .../xin/ctkqiang/config/Configuration.java | 4 +++- .../controller/DatabaseController.java | 2 +- .../xin/ctkqiang/controller/UserUtil.java | 2 +- 4 files changed, 22 insertions(+), 10 deletions(-) diff --git a/src/main/java/xin/ctkqiang/Main.java b/src/main/java/xin/ctkqiang/Main.java index bee54f1..9daaf4c 100644 --- a/src/main/java/xin/ctkqiang/Main.java +++ b/src/main/java/xin/ctkqiang/Main.java @@ -25,14 +25,24 @@ public class Main { private static List allowed = Arrays.asList("csv", "json", "sql"); - private static Configuration Config; + private static Configuration Config = new Configuration();; private static void PrintBanner() { - System.out.println("==================================="); - System.out.println(" " + TITLE + " v" + VERSION); - System.out.println(" Author: " + AUTHOR); - System.out.println(" " + DESCRIPTION); - System.out.println("===================================\n"); + System.out.println(); + System.out.println("╭─────────────────────────────────────────────────────────────────────────╮"); + System.out.println("│ (๑˃̵ᴗ˂̵)و 欢迎来到灵儿的安全世界呀~♡"); + System.out.println("│ "); + System.out.println("│ 工具名称:" + TITLE + " v" + VERSION); + System.out.println("│ 作者昵称:" + AUTHOR); + System.out.println("│ 简介说明:" + DESCRIPTION); + System.out.println("│ "); + System.out.println("│ 💌 声明一下哦,我可是乖乖的好孩子呢! "); + System.out.println("│ 这个工具是用来做好事的,不是用来做坏事的~ "); + System.out.println("│ 但是,如果有人坏坏地用它去做不好的事情, "); + System.out.println("│ 哥哥姐姐们可要自己负责啦,我是不背锅的小可爱哟~(๑•̀ㅂ•́)و✧ "); + System.out.println("│ 我不对任何恶意使用、违法操作产生的后果负责哟~请乖乖做正义的萌新吧!"); + System.out.println("╰─────────────────────────────────────────────────────────────────────────╯"); + System.out.println(); } public static void main(String[] args) { @@ -53,7 +63,7 @@ public static void main(String[] args) { // Main.Config.setDatabaseMode(Database.MYSQL); Main.Config.setDatabaseMode(Database.SQLITE); - int pages = userUtil.askForPositiveInt("📄 想爬多少页咧~?(建议填个50以上更爽!):"); + int pages = userUtil.askForPositiveInt("📄 想爬多少页咧~?【建议填个50以上更爽!】"); boolean isExport = userUtil.askForYesNo("💾 要不要顺便导出数据嘞?(支持 .csv/.json/.sql哦)✨:"); if (isExport) { diff --git a/src/main/java/xin/ctkqiang/config/Configuration.java b/src/main/java/xin/ctkqiang/config/Configuration.java index e54dd05..bc2083b 100644 --- a/src/main/java/xin/ctkqiang/config/Configuration.java +++ b/src/main/java/xin/ctkqiang/config/Configuration.java @@ -3,7 +3,7 @@ import xin.ctkqiang.dto.Database; public class Configuration { - public String DatabaseMode; + public String DatabaseMode = Database.MYSQL.getValue(); public static final String DB_NAME = "ExploitDB"; public static final String DB_URL = "jdbc:mysql://localhost:3306/" + DB_NAME @@ -23,5 +23,7 @@ public String getDatabaseMode() { public void setDatabaseMode(Database databaseMode) { this.DatabaseMode = databaseMode.getValue(); + + System.out.println(String.format("🎀 你当前选择的数据库模式是:「%s」~酱酱 ♪(๑˃ᴗ˂)ﻭ \n", this.getDatabaseMode())); } } diff --git a/src/main/java/xin/ctkqiang/controller/DatabaseController.java b/src/main/java/xin/ctkqiang/controller/DatabaseController.java index 49e69c2..8cfb15e 100644 --- a/src/main/java/xin/ctkqiang/controller/DatabaseController.java +++ b/src/main/java/xin/ctkqiang/controller/DatabaseController.java @@ -48,7 +48,7 @@ public class DatabaseController { /** SQLITE 数据库连接URL */ protected final static String DB_SQLITE_URL = Configuration.DB_SQLITE_URL; - private Configuration Config; + private Configuration Config = new Configuration();; /** * 静态初始化块 diff --git a/src/main/java/xin/ctkqiang/controller/UserUtil.java b/src/main/java/xin/ctkqiang/controller/UserUtil.java index a8412b7..817212f 100644 --- a/src/main/java/xin/ctkqiang/controller/UserUtil.java +++ b/src/main/java/xin/ctkqiang/controller/UserUtil.java @@ -15,7 +15,7 @@ public int askForPositiveInt(String prompt) { int result = DEFAULT; while (true) { - System.out.print(prompt + " (默认 " + DEFAULT + "): "); + System.out.print(prompt + " (默认 " + DEFAULT + "): 🌼 "); String input = scanner.nextLine().trim(); if (input.isEmpty()) { From 419bd0daa725c961074a7dc270a365461c5a7b98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=92=9F=E6=99=BA=E5=BC=BA?= Date: Fri, 30 May 2025 16:01:11 +0800 Subject: [PATCH 4/6] =?UTF-8?q?style:=20=E4=BC=98=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E6=A0=BC=E5=BC=8F=E5=92=8C=E7=95=8C=E9=9D=A2=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E9=A3=8E=E6=A0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 初始化 Configuration 对象避免空指针 - 在用户输入提示中添加表情符号增强交互体验 - 为数据库模式设置默认值并添加设置成功的提示信息 - 重写欢迎横幅使其更加生动可爱 - 统一代码中的分号使用 Co-Authored-By: zerorzeror <59408685+zerorzeror@users.noreply.github.com> Co-Authored-By: 🇨🇳钟智强 『上饶满星科技』 #2 --- src/main/java/xin/ctkqiang/Main.java | 24 +++++++++++++------ .../xin/ctkqiang/config/Configuration.java | 4 +++- .../controller/DatabaseController.java | 2 +- .../xin/ctkqiang/controller/UserUtil.java | 2 +- 4 files changed, 22 insertions(+), 10 deletions(-) diff --git a/src/main/java/xin/ctkqiang/Main.java b/src/main/java/xin/ctkqiang/Main.java index bee54f1..9daaf4c 100644 --- a/src/main/java/xin/ctkqiang/Main.java +++ b/src/main/java/xin/ctkqiang/Main.java @@ -25,14 +25,24 @@ public class Main { private static List allowed = Arrays.asList("csv", "json", "sql"); - private static Configuration Config; + private static Configuration Config = new Configuration();; private static void PrintBanner() { - System.out.println("==================================="); - System.out.println(" " + TITLE + " v" + VERSION); - System.out.println(" Author: " + AUTHOR); - System.out.println(" " + DESCRIPTION); - System.out.println("===================================\n"); + System.out.println(); + System.out.println("╭─────────────────────────────────────────────────────────────────────────╮"); + System.out.println("│ (๑˃̵ᴗ˂̵)و 欢迎来到灵儿的安全世界呀~♡"); + System.out.println("│ "); + System.out.println("│ 工具名称:" + TITLE + " v" + VERSION); + System.out.println("│ 作者昵称:" + AUTHOR); + System.out.println("│ 简介说明:" + DESCRIPTION); + System.out.println("│ "); + System.out.println("│ 💌 声明一下哦,我可是乖乖的好孩子呢! "); + System.out.println("│ 这个工具是用来做好事的,不是用来做坏事的~ "); + System.out.println("│ 但是,如果有人坏坏地用它去做不好的事情, "); + System.out.println("│ 哥哥姐姐们可要自己负责啦,我是不背锅的小可爱哟~(๑•̀ㅂ•́)و✧ "); + System.out.println("│ 我不对任何恶意使用、违法操作产生的后果负责哟~请乖乖做正义的萌新吧!"); + System.out.println("╰─────────────────────────────────────────────────────────────────────────╯"); + System.out.println(); } public static void main(String[] args) { @@ -53,7 +63,7 @@ public static void main(String[] args) { // Main.Config.setDatabaseMode(Database.MYSQL); Main.Config.setDatabaseMode(Database.SQLITE); - int pages = userUtil.askForPositiveInt("📄 想爬多少页咧~?(建议填个50以上更爽!):"); + int pages = userUtil.askForPositiveInt("📄 想爬多少页咧~?【建议填个50以上更爽!】"); boolean isExport = userUtil.askForYesNo("💾 要不要顺便导出数据嘞?(支持 .csv/.json/.sql哦)✨:"); if (isExport) { diff --git a/src/main/java/xin/ctkqiang/config/Configuration.java b/src/main/java/xin/ctkqiang/config/Configuration.java index e54dd05..bc2083b 100644 --- a/src/main/java/xin/ctkqiang/config/Configuration.java +++ b/src/main/java/xin/ctkqiang/config/Configuration.java @@ -3,7 +3,7 @@ import xin.ctkqiang.dto.Database; public class Configuration { - public String DatabaseMode; + public String DatabaseMode = Database.MYSQL.getValue(); public static final String DB_NAME = "ExploitDB"; public static final String DB_URL = "jdbc:mysql://localhost:3306/" + DB_NAME @@ -23,5 +23,7 @@ public String getDatabaseMode() { public void setDatabaseMode(Database databaseMode) { this.DatabaseMode = databaseMode.getValue(); + + System.out.println(String.format("🎀 你当前选择的数据库模式是:「%s」~酱酱 ♪(๑˃ᴗ˂)ﻭ \n", this.getDatabaseMode())); } } diff --git a/src/main/java/xin/ctkqiang/controller/DatabaseController.java b/src/main/java/xin/ctkqiang/controller/DatabaseController.java index 49e69c2..8cfb15e 100644 --- a/src/main/java/xin/ctkqiang/controller/DatabaseController.java +++ b/src/main/java/xin/ctkqiang/controller/DatabaseController.java @@ -48,7 +48,7 @@ public class DatabaseController { /** SQLITE 数据库连接URL */ protected final static String DB_SQLITE_URL = Configuration.DB_SQLITE_URL; - private Configuration Config; + private Configuration Config = new Configuration();; /** * 静态初始化块 diff --git a/src/main/java/xin/ctkqiang/controller/UserUtil.java b/src/main/java/xin/ctkqiang/controller/UserUtil.java index a8412b7..817212f 100644 --- a/src/main/java/xin/ctkqiang/controller/UserUtil.java +++ b/src/main/java/xin/ctkqiang/controller/UserUtil.java @@ -15,7 +15,7 @@ public int askForPositiveInt(String prompt) { int result = DEFAULT; while (true) { - System.out.print(prompt + " (默认 " + DEFAULT + "): "); + System.out.print(prompt + " (默认 " + DEFAULT + "): 🌼 "); String input = scanner.nextLine().trim(); if (input.isEmpty()) { From 2f41080a8300aa6e08a8d800a42a8e9d77496440 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=92=9F=E6=99=BA=E5=BC=BA?= Date: Fri, 30 May 2025 18:03:50 +0800 Subject: [PATCH 5/6] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20readme.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将 Configuration 类中的 DatabaseMode 改为静态变量,并调整相关方法为静态方法 重构 DatabaseController 的连接逻辑,根据配置动态选择 MySQL 或 SQLite 数据库 更新 Main 类使用静态配置方法,并完善使用说明和联系信息 同时更新 .gitignore 忽略 SQLite 数据库文件 参考 #2 和 #1 Co-Authored-By: 🇨🇳钟智强 『上饶满星科技』 Co-Authored-By: zerorzeror <59408685+zerorzeror@users.noreply.github.com> --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index c7e1883..8bbb453 100644 --- a/README.md +++ b/README.md @@ -64,7 +64,12 @@ ```bash mvn clean compile exec:java +``` + +# Maven 来打包成 jar +```bash +mvn clean package ``` 首次运行时会: From 0a0c0b7a466a93385081e763c267569234124aec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=92=9F=E6=99=BA=E5=BC=BA?= Date: Fri, 30 May 2025 18:03:55 +0800 Subject: [PATCH 6/6] =?UTF-8?q?refactor(database):=20=E9=87=8D=E6=9E=84?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=BA=93=E9=85=8D=E7=BD=AE=E5=92=8C=E8=BF=9E?= =?UTF-8?q?=E6=8E=A5=E9=80=BB=E8=BE=91=E4=BB=A5=E6=94=AF=E6=8C=81=E5=A4=9A?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=BA=93=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将 Configuration 类中的 DatabaseMode 改为静态变量,并调整相关方法为静态方法 重构 DatabaseController 的连接逻辑,根据配置动态选择 MySQL 或 SQLite 数据库 更新 Main 类使用静态配置方法,并完善使用说明和联系信息 同时更新 .gitignore 忽略 SQLite 数据库文件 ``` 这个提交消息: 1. 使用 refactor 类型,因为主要是代码结构调整和优化 2. 添加了 scope(database) 说明修改范围 3. 简明扼要地描述了主要修改内容 4. 在正文中详细说明了具体的重构点 5. 保持了简洁和专业性,同时涵盖了所有重要修改 参考 #2 和 #1 --- .gitignore | 1 + src/main/java/xin/ctkqiang/Main.java | 64 +++++++++++++------ .../xin/ctkqiang/config/Configuration.java | 17 +++-- .../controller/DatabaseController.java | 34 ++++++++-- 4 files changed, 82 insertions(+), 34 deletions(-) diff --git a/.gitignore b/.gitignore index 46a86c4..ff353a5 100644 --- a/.gitignore +++ b/.gitignore @@ -68,3 +68,4 @@ out/ # 临时环境变量文件 .env +*.sqlite diff --git a/src/main/java/xin/ctkqiang/Main.java b/src/main/java/xin/ctkqiang/Main.java index 9daaf4c..402c3bf 100644 --- a/src/main/java/xin/ctkqiang/Main.java +++ b/src/main/java/xin/ctkqiang/Main.java @@ -13,8 +13,11 @@ public class Main { public static final String VERSION = "1.0"; public static final String TITLE = "ExploitDB 搜索工具"; public static final String AUTHOR = "钟智强"; + public static final String EMAIL = "ctkqiang@dingtalk.com"; + public static final String GITHUB = "https://github.com/ctkqiang"; + public static final String GITCODE = "https://gitcode.com/ctkqiang_sr"; public static final String DESCRIPTION = "ExploitDB 搜索工具"; - public static final String USAGE = "mvn clean compile exec:java"; + public static final String USAGE = "mvn clean compile exec:java 或 java -jar {FILENAME}.jar"; public static final Scanner scanner = new Scanner(System.in); @@ -25,22 +28,24 @@ public class Main { private static List allowed = Arrays.asList("csv", "json", "sql"); - private static Configuration Config = new Configuration();; - private static void PrintBanner() { System.out.println(); System.out.println("╭─────────────────────────────────────────────────────────────────────────╮"); - System.out.println("│ (๑˃̵ᴗ˂̵)و 欢迎来到灵儿的安全世界呀~♡"); - System.out.println("│ "); + System.out.println("│ (๑˃̵ᴗ˂̵)و 欢迎来到灵儿的安全世界呀~♡ (づ。◕‿‿◕。)づ "); + System.out.println("│ "); System.out.println("│ 工具名称:" + TITLE + " v" + VERSION); - System.out.println("│ 作者昵称:" + AUTHOR); + System.out.println("│ 作者昵称:" + AUTHOR + " (๑•̀ㅂ•́)و✧"); System.out.println("│ 简介说明:" + DESCRIPTION); - System.out.println("│ "); - System.out.println("│ 💌 声明一下哦,我可是乖乖的好孩子呢! "); - System.out.println("│ 这个工具是用来做好事的,不是用来做坏事的~ "); - System.out.println("│ 但是,如果有人坏坏地用它去做不好的事情, "); - System.out.println("│ 哥哥姐姐们可要自己负责啦,我是不背锅的小可爱哟~(๑•̀ㅂ•́)و✧ "); - System.out.println("│ 我不对任何恶意使用、违法操作产生的后果负责哟~请乖乖做正义的萌新吧!"); + System.out.println("│ "); + System.out.println("│ 📧 邮箱联系: " + EMAIL); + System.out.println("│ 💻 GitHub : " + GITHUB); + System.out.println("│ 📂 GitCode : " + GITCODE); + System.out.println("│ "); + System.out.println("│ 🛠️ 使用方法: " + USAGE); + System.out.println("│ "); + System.out.println("│ 💌 小声明哟~我是乖乖的好孩子,这工具是帮大家做好事的~ "); + System.out.println("│ 不是让坏蛋乱用的哦 (ง •̀_•́)ง "); + System.out.println("│ 如果有人坏坏地用了,后果自负哒~我不背锅哦~请保持正义感~♡ "); System.out.println("╰─────────────────────────────────────────────────────────────────────────╯"); System.out.println(); } @@ -50,18 +55,35 @@ public static void main(String[] args) { Main.PrintBanner(); /** - * 设置数据库模式 ♡ - * 可选值请查阅 {@link xin.ctkqiang.dto.Database Database} 枚举类: + * 嘻嘻~这里是数据库模式设置哦 ♡ + * 你可以从 {@link xin.ctkqiang.dto.Database Database} 枚举里选一个最爱滴数据库: *
    - *
  • {@link xin.ctkqiang.dto.Database#MYSQL MYSQL} :标准的 MySQL 数据库
  • - *
  • {@link xin.ctkqiang.dto.Database#SQLite SQLite} :轻量级嵌入式数据库
  • + *
  • {@link xin.ctkqiang.dto.Database#MYSQL MYSQL} :咱们平时用的 MySQL + * 数据库,默认就选它啦~
  • + *
  • {@link xin.ctkqiang.dto.Database#SQLITE SQLITE} :轻巧灵活的 SQLite + * 嵌入式数据库,萌萌哒!
  • *
- * 如果想用 SQLite,就把这里改成 {@link xin.ctkqiang.dto.Database#SQLite Database.SQLITE} - * 哦~ ✨🤭⚡️🌸🌸🌸 + * + * 小提示✨:默认模式是 MYSQL 哦,要用 SQLite 的话,记得把下面的代码改成 + * Configuration.setDatabaseMode(Database.SQLITE); 才能生效呢~ + * + * 举个栗子给你看👇: + * + * 乖乖用【默认】 MySQL 嘛 ~ + * + *
+             * Configuration.setDatabaseMode(Database.MYSQL);
+             * 
+ * + * 想用 SQLite ~ + * + *
+             * Configuration.setDatabaseMode(Database.SQLITE);
+             * 
+ * + * 嘻嘻,这样就能轻轻松松切换数据库, 你棒棒啦!🎀🌸💖 */ - - // Main.Config.setDatabaseMode(Database.MYSQL); - Main.Config.setDatabaseMode(Database.SQLITE); + Configuration.setDatabaseMode(Database.SQLITE); int pages = userUtil.askForPositiveInt("📄 想爬多少页咧~?【建议填个50以上更爽!】"); boolean isExport = userUtil.askForYesNo("💾 要不要顺便导出数据嘞?(支持 .csv/.json/.sql哦)✨:"); diff --git a/src/main/java/xin/ctkqiang/config/Configuration.java b/src/main/java/xin/ctkqiang/config/Configuration.java index bc2083b..2c08799 100644 --- a/src/main/java/xin/ctkqiang/config/Configuration.java +++ b/src/main/java/xin/ctkqiang/config/Configuration.java @@ -3,7 +3,7 @@ import xin.ctkqiang.dto.Database; public class Configuration { - public String DatabaseMode = Database.MYSQL.getValue(); + private static String DatabaseMode = Database.MYSQL.getValue(); public static final String DB_NAME = "ExploitDB"; public static final String DB_URL = "jdbc:mysql://localhost:3306/" + DB_NAME @@ -11,19 +11,18 @@ public class Configuration { public static final String DB_SQLITE_URL = "jdbc:sqlite:ling.sqlite"; - public static final String DB_USER = "root"; // 改成你的数据库用户名 - public static final String DB_PASSWORD = ""; // 改成你的数据库密码 + public static final String DB_USER = "root"; + public static final String DB_PASSWORD = ""; public static final String DB_DRIVER = "com.mysql.cj.jdbc.Driver"; public static final boolean DEBUG = false; - public String getDatabaseMode() { - return this.DatabaseMode; + public static String getDatabaseMode() { + return DatabaseMode; } - public void setDatabaseMode(Database databaseMode) { - this.DatabaseMode = databaseMode.getValue(); - - System.out.println(String.format("🎀 你当前选择的数据库模式是:「%s」~酱酱 ♪(๑˃ᴗ˂)ﻭ \n", this.getDatabaseMode())); + public static void setDatabaseMode(Database databaseMode) { + DatabaseMode = databaseMode.getValue(); + System.out.println(String.format("🎀 你当前选择的数据库模式是:「%s」~酱酱 ♪(๑˃ᴗ˂)ﻭ \n", getDatabaseMode())); } } diff --git a/src/main/java/xin/ctkqiang/controller/DatabaseController.java b/src/main/java/xin/ctkqiang/controller/DatabaseController.java index 8cfb15e..dbbc4a3 100644 --- a/src/main/java/xin/ctkqiang/controller/DatabaseController.java +++ b/src/main/java/xin/ctkqiang/controller/DatabaseController.java @@ -48,8 +48,6 @@ public class DatabaseController { /** SQLITE 数据库连接URL */ protected final static String DB_SQLITE_URL = Configuration.DB_SQLITE_URL; - private Configuration Config = new Configuration();; - /** * 静态初始化块 * 在类加载时尝试加载数据库驱动 @@ -69,7 +67,35 @@ public class DatabaseController { * @throws SQLException 如果连接数据库时发生错误 */ protected Connection getConnection() throws SQLException { - return DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD); + String mode = Configuration.getDatabaseMode(); + String upperMode = mode.toUpperCase(); + System.out.println("💡 切换数据库模式 -> " + upperMode); + + switch (upperMode) { + case "SQLITE": + try { + Class.forName("org.sqlite.JDBC"); + System.out.println("📦 嘻嘻~SQLite 驱动已加载好惹!我已经抱好数据库小可爱啦~ฅ(^・ω・^ฅ)"); + } catch (ClassNotFoundException e) { + System.err.println("❌ 哎呀呀!SQLite JDBC 驱动不见惹~人家找不到驱动怎么贴贴数据库嘛喵呜呜。゚(゚´ω`゚)゚。"); + throw new SQLException("找不到 SQLite 驱动喵~要不要检查一下依赖有没有加对呀?"); + } + return DriverManager.getConnection(DatabaseController.DB_SQLITE_URL); + + case "MYSQL": + default: + try { + Class.forName(DatabaseController.DB_DRIVER); + System.out.println("📦 MySQL 驱动加载完成!我打扮好了,要去连接数据库小哥哥啦~(๑•̀ㅂ•́)و✧"); + } catch (ClassNotFoundException e) { + System.err.println("❌ 呜呜呜 MySQL JDBC 驱动不见了~是不是打包的时候忘记带灵儿一起走啦 >///< "); + throw new SQLException("MySQL 驱动加载失败了喵~快检查一下 `.jar` 有没有遗漏吧!"); + } + return DriverManager.getConnection( + DatabaseController.DB_URL, + DatabaseController.DB_USER, + DatabaseController.DB_PASSWORD); + } } /** @@ -116,7 +142,7 @@ public void CreateTableIfNotExists() { try { - String mode = this.Config.getDatabaseMode(); + String mode = Configuration.getDatabaseMode(); Database dbMode; try {