diff --git a/pom.xml b/pom.xml index 8e594bb01a36601873e8b046d8e495de70730963..1bcbcd6bd47dc2815e43f65f5e1491afc0da485e 100644 --- a/pom.xml +++ b/pom.xml @@ -29,15 +29,27 @@ org.apache.maven.plugins - maven-jar-plugin - 3.3.0 + maven-assembly-plugin + 3.6.0 + + jar-with-dependencies + com.example.climenu.Main + + + make-assembly + package + + single + + + diff --git a/src/main/java/com/example/climenu/Main.java b/src/main/java/com/example/climenu/Main.java index 7724999ed2f05c5a8ca575dcd43fa8f557089257..538d07233dbe37c84b74710b7fe0aa3d64f8da61 100644 --- a/src/main/java/com/example/climenu/Main.java +++ b/src/main/java/com/example/climenu/Main.java @@ -18,33 +18,31 @@ public class Main { private static void runInteractiveMenu() { Scanner scanner = new Scanner(System.in); - MenuCommand menuCmd = new MenuCommand(); // 实例化用于调用方法 + MenuCommand menuCmd = new MenuCommand(); // 实例化命令对象 while (true) { // 循环直到用户选择退出 - // 显示菜单(调用 MenuCommand 中的方法) + // 显示菜单 menuCmd.showMenu(); System.out.print("请选择操作 (输入 1-3 或 'exit' 退出): "); + // 处理可能的残留换行符 String input = scanner.nextLine().trim(); + if (input.isEmpty()) { + input = scanner.nextLine().trim(); + } switch (input) { case "1": - // 模拟执行 -t 命令 - System.out.println("🕒 " + CommandLine.Help.Ansi.AUTO.string("@|bold,green " + java.time.LocalDateTime.now().format(java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")) + "|@")); + // 调用时间显示逻辑(复用MenuCommand的实现) + new CommandLine(new MenuCommand()).execute("-t"); break; case "2": System.out.print("请输入要计算的斐波那契数列项数 N: "); try { String fibInput = scanner.nextLine().trim(); int n = Integer.parseInt(fibInput); - if (n <= 0) { - System.err.println(CommandLine.Help.Ansi.AUTO.string("@|red 请输入一个正整数。|@")); - break; - } - System.out.println(CommandLine.Help.Ansi.AUTO.string("@|yellow 斐波那契数列(前" + n + "项):|@")); - for (int i = 0; i < n; i++) { - System.out.println(" " + CommandLine.Help.Ansi.AUTO.string("@|cyan " + fibonacci(i) + "|@")); - } + // 调用统一的斐波那契计算方法 + menuCmd.calculateAndPrintFibonacci(n); } catch (NumberFormatException e) { System.err.println(CommandLine.Help.Ansi.AUTO.string("@|red 输入无效,请输入一个数字。|@")); } @@ -61,10 +59,4 @@ public class Main { System.out.println(); // 空行分隔 } } - - // 为了在 Main 中复用,将 fibonacci 方法也移到这里,或在 MenuCommand 中设为 public static - private static long fibonacci(int n) { - if (n <= 1) return n; - return fibonacci(n - 1) + fibonacci(n - 2); - } } \ No newline at end of file diff --git a/src/main/java/com/example/climenu/MenuCommand.java b/src/main/java/com/example/climenu/MenuCommand.java index 22b3841d26999e9dd73587ef5d9d876e4dfc9be4..dd7d5ca0f0bf3594e49761f31f9ea95c7ec06753 100644 --- a/src/main/java/com/example/climenu/MenuCommand.java +++ b/src/main/java/com/example/climenu/MenuCommand.java @@ -32,23 +32,27 @@ public class MenuCommand implements Callable { } if (fibonacciCount != null) { - if (fibonacciCount <= 0) { - System.err.println(Ansi.AUTO.string("@|red 请输入一个正整数作为斐波那契数列的项数。|@")); - return 1; - } - System.out.println(Ansi.AUTO.string("@|yellow 斐波那契数列(前" + fibonacciCount + "项):|@")); - for (int i = 0; i < fibonacciCount; i++) { - System.out.println(" " + Ansi.AUTO.string("@|cyan " + fibonacci(i) + "|@")); - } - return 0; + return calculateAndPrintFibonacci(fibonacciCount); } - // 当使用 picocli 方式运行且没有任何功能选项时,也显示菜单 + // 当使用 picocli 方式运行且没有任何功能选项时,显示菜单 showMenu(); return 0; } - // 移除 private,改为 public,以便 Main 类可以调用 + // 提取为公共方法,供交互式菜单调用 + public int calculateAndPrintFibonacci(int count) { + if (count <= 0) { + System.err.println(Ansi.AUTO.string("@|red 请输入一个正整数作为斐波那契数列的项数。|@")); + return 1; + } + System.out.println(Ansi.AUTO.string("@|yellow 斐波那契数列(前" + count + "项):|@")); + for (int i = 0; i < count; i++) { + System.out.println(" " + Ansi.AUTO.string("@|cyan " + fibonacci(i) + "|@")); + } + return 0; + } + public void showMenu() { System.out.println(Ansi.AUTO.string("@|bold,blue \n======== 欢迎使用 CLI 菜单助手 ========|@")); System.out.println("1. " + Ansi.AUTO.string("@|yellow 显示当前时间|@"));