9 changed files with 552 additions and 40 deletions
@ -0,0 +1,2 @@ |
|||
*.class |
|||
target/* |
|||
@ -0,0 +1,3 @@ |
|||
{ |
|||
"java.configuration.updateBuildConfiguration": "interactive" |
|||
} |
|||
@ -0,0 +1,23 @@ |
|||
@echo off |
|||
REM PKM - Personal Knowledge Management System |
|||
REM 个人知识管理系统快捷启动脚本 |
|||
|
|||
REM 切换到脚本所在目录 |
|||
cd /d "%~dp0" |
|||
|
|||
REM 检查是否需要编译 |
|||
if not exist target\classes\com\example\App.class ( |
|||
echo 首次运行,正在编译项目... |
|||
mkdir target\classes 2>nul |
|||
javac -cp src\main\java -d target\classes src\main\java\com\example\*.java src\main\java\com\example\cli\*.java src\main\java\com\example\model\*.java |
|||
if %errorlevel% neq 0 ( |
|||
echo 编译失败! |
|||
pause |
|||
exit /b 1 |
|||
) |
|||
echo 编译成功! |
|||
echo. |
|||
) |
|||
|
|||
REM 运行程序,传递所有参数 |
|||
java -cp target\classes com.example.App %* |
|||
@ -1,18 +1,25 @@ |
|||
@echo off |
|||
REM Personal Knowledge Management System - CLI Version |
|||
REM 个人知识管理系统 - 命令行版本 |
|||
|
|||
REM 检查是否需要编译 |
|||
if not exist target\classes\com\example\App.class ( |
|||
echo 首次运行,正在编译项目... |
|||
call :compile |
|||
) |
|||
|
|||
REM 运行程序,传递所有参数 |
|||
java -cp target\classes com.example.App %* |
|||
goto :eof |
|||
|
|||
:compile |
|||
echo 正在编译Java项目... |
|||
javac -cp src\main\java -d target\classes src\main\java\com\example\App.java |
|||
mkdir target\classes 2>nul |
|||
javac -cp src\main\java -d target\classes src\main\java\com\example\*.java src\main\java\com\example\cli\*.java src\main\java\com\example\model\*.java |
|||
if %errorlevel% neq 0 ( |
|||
echo 编译失败! |
|||
pause |
|||
exit /b 1 |
|||
) |
|||
echo 编译成功! |
|||
|
|||
echo. |
|||
echo 正在运行应用程序... |
|||
echo ======================== |
|||
java -cp target\classes com.example.App |
|||
echo ======================== |
|||
echo. |
|||
echo 程序运行完成! |
|||
pause |
|||
goto :eof |
|||
|
|||
@ -1,13 +1,23 @@ |
|||
package com.example; |
|||
|
|||
import com.example.cli.CommandParser; |
|||
|
|||
/** |
|||
* Hello World Application |
|||
* Personal Knowledge Management System - CLI Version |
|||
* |
|||
* 这是一个简单的Java应用程序,用于输出"Hello World"到控制台 |
|||
* 个人知识管理系统命令行版本 |
|||
*/ |
|||
public class App { |
|||
public static void main(String[] args) { |
|||
System.out.println("Hello World!"); |
|||
System.out.println("欢迎使用Java Maven项目!"); |
|||
CommandParser parser = new CommandParser(); |
|||
|
|||
try { |
|||
parser.parseArgs(args); |
|||
} catch (Exception e) { |
|||
System.err.println("程序执行出错: " + e.getMessage()); |
|||
e.printStackTrace(); |
|||
} finally { |
|||
parser.close(); |
|||
} |
|||
} |
|||
} |
|||
|
|||
@ -0,0 +1,357 @@ |
|||
package com.example.cli; |
|||
|
|||
import java.util.Arrays; |
|||
import java.util.HashMap; |
|||
import java.util.Map; |
|||
import java.util.Scanner; |
|||
|
|||
public class CommandParser { |
|||
private Scanner scanner; |
|||
private boolean isRunning; |
|||
|
|||
public CommandParser() { |
|||
this.scanner = new Scanner(System.in); |
|||
this.isRunning = true; |
|||
} |
|||
|
|||
/** |
|||
* 解析命令行参数 |
|||
*/ |
|||
public void parseArgs(String[] args) { |
|||
if (args.length == 0) { |
|||
// 进入交互模式
|
|||
startInteractiveMode(); |
|||
} else { |
|||
// 执行单个命令
|
|||
executeCommand(String.join(" ", args)); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 启动交互式命令行模式 |
|||
*/ |
|||
private void startInteractiveMode() { |
|||
System.out.println("欢迎使用个人知识管理系统 (CLI版)"); |
|||
System.out.println("输入 help 查看可用命令\n"); |
|||
|
|||
while (isRunning) { |
|||
System.out.print("pkm> "); |
|||
String input = scanner.nextLine().trim(); |
|||
|
|||
if (!input.isEmpty()) { |
|||
executeCommand(input); |
|||
} |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 执行命令 |
|||
*/ |
|||
private void executeCommand(String commandLine) { |
|||
String[] parts = parseCommandLine(commandLine); |
|||
if (parts.length == 0) return; |
|||
|
|||
String command = parts[0].toLowerCase(); |
|||
String[] args = Arrays.copyOfRange(parts, 1, parts.length); |
|||
|
|||
switch (command) { |
|||
case "new": |
|||
handleNewCommand(args); |
|||
break; |
|||
case "list": |
|||
handleListCommand(args); |
|||
break; |
|||
case "view": |
|||
handleViewCommand(args); |
|||
break; |
|||
case "edit": |
|||
handleEditCommand(args); |
|||
break; |
|||
case "delete": |
|||
handleDeleteCommand(args); |
|||
break; |
|||
case "tag": |
|||
handleTagCommand(args); |
|||
break; |
|||
case "untag": |
|||
handleUntagCommand(args); |
|||
break; |
|||
case "search": |
|||
handleSearchCommand(args); |
|||
break; |
|||
case "export": |
|||
handleExportCommand(args); |
|||
break; |
|||
case "export-all": |
|||
handleExportAllCommand(args); |
|||
break; |
|||
case "help": |
|||
handleHelpCommand(); |
|||
break; |
|||
case "exit": |
|||
case "quit": |
|||
handleExitCommand(); |
|||
break; |
|||
default: |
|||
System.out.println("未知命令: " + command); |
|||
System.out.println("输入 help 查看可用命令"); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 解析命令行,支持引号包围的参数 |
|||
*/ |
|||
private String[] parseCommandLine(String commandLine) { |
|||
return commandLine.split("\\s+(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)"); |
|||
} |
|||
|
|||
/** |
|||
* 处理 new 命令 |
|||
*/ |
|||
private void handleNewCommand(String[] args) { |
|||
if (args.length < 2) { |
|||
System.out.println("用法: new <标题> <内容>"); |
|||
System.out.println("示例: new \"Java笔记\" \"面向对象编程的三大特性...\""); |
|||
return; |
|||
} |
|||
|
|||
String title = args[0].replaceAll("^\"|\"$", ""); |
|||
String content = args[1].replaceAll("^\"|\"$", ""); |
|||
|
|||
System.out.println("创建笔记: " + title); |
|||
System.out.println("内容: " + content); |
|||
// TODO: 调用 NoteController.createNote()
|
|||
} |
|||
|
|||
/** |
|||
* 处理 list 命令 |
|||
*/ |
|||
private void handleListCommand(String[] args) { |
|||
Map<String, String> options = parseOptions(args); |
|||
|
|||
if (options.containsKey("tag")) { |
|||
String tag = options.get("tag"); |
|||
System.out.println("列出标签为 '" + tag + "' 的笔记:"); |
|||
} else { |
|||
System.out.println("列出所有笔记:"); |
|||
} |
|||
|
|||
// TODO: 调用 NoteController.listNotes()
|
|||
// 示例输出格式
|
|||
System.out.println("[1] Java笔记 (2023-10-01) [编程, 学习]"); |
|||
System.out.println("[2] 设计模式笔记 (2023-10-05) [编程, 架构]"); |
|||
} |
|||
|
|||
/** |
|||
* 处理 view 命令 |
|||
*/ |
|||
private void handleViewCommand(String[] args) { |
|||
if (args.length < 1) { |
|||
System.out.println("用法: view <笔记ID>"); |
|||
System.out.println("示例: view 123e4567"); |
|||
return; |
|||
} |
|||
|
|||
String noteId = args[0]; |
|||
System.out.println("查看笔记: " + noteId); |
|||
// TODO: 调用 NoteController.viewNote()
|
|||
} |
|||
|
|||
/** |
|||
* 处理 edit 命令 |
|||
*/ |
|||
private void handleEditCommand(String[] args) { |
|||
if (args.length < 2) { |
|||
System.out.println("用法: edit <笔记ID> <新内容>"); |
|||
System.out.println("示例: edit 123e4567 \"更新的内容\""); |
|||
return; |
|||
} |
|||
|
|||
String noteId = args[0]; |
|||
String newContent = args[1].replaceAll("^\"|\"$", ""); |
|||
|
|||
System.out.println("编辑笔记: " + noteId); |
|||
System.out.println("新内容: " + newContent); |
|||
// TODO: 调用 NoteController.editNote()
|
|||
} |
|||
|
|||
/** |
|||
* 处理 delete 命令 |
|||
*/ |
|||
private void handleDeleteCommand(String[] args) { |
|||
if (args.length < 1) { |
|||
System.out.println("用法: delete <笔记ID>"); |
|||
System.out.println("示例: delete 123e4567"); |
|||
return; |
|||
} |
|||
|
|||
String noteId = args[0]; |
|||
System.out.println("删除笔记: " + noteId); |
|||
// TODO: 调用 NoteController.deleteNote()
|
|||
} |
|||
|
|||
/** |
|||
* 处理 tag 命令 |
|||
*/ |
|||
private void handleTagCommand(String[] args) { |
|||
if (args.length < 2) { |
|||
System.out.println("用法: tag <笔记ID> <标签>"); |
|||
System.out.println("示例: tag 123e4567 programming"); |
|||
return; |
|||
} |
|||
|
|||
String noteId = args[0]; |
|||
String tag = args[1]; |
|||
|
|||
System.out.println("为笔记 " + noteId + " 添加标签: " + tag); |
|||
// TODO: 调用 TagController.addTag()
|
|||
} |
|||
|
|||
/** |
|||
* 处理 untag 命令 |
|||
*/ |
|||
private void handleUntagCommand(String[] args) { |
|||
if (args.length < 2) { |
|||
System.out.println("用法: untag <笔记ID> <标签>"); |
|||
System.out.println("示例: untag 123e4567 old"); |
|||
return; |
|||
} |
|||
|
|||
String noteId = args[0]; |
|||
String tag = args[1]; |
|||
|
|||
System.out.println("从笔记 " + noteId + " 移除标签: " + tag); |
|||
// TODO: 调用 TagController.removeTag()
|
|||
} |
|||
|
|||
/** |
|||
* 处理 search 命令 |
|||
*/ |
|||
private void handleSearchCommand(String[] args) { |
|||
if (args.length < 1) { |
|||
System.out.println("用法: search <关键词>"); |
|||
System.out.println("示例: search \"设计模式\""); |
|||
return; |
|||
} |
|||
|
|||
String keyword = String.join(" ", args).replaceAll("^\"|\"$", ""); |
|||
System.out.println("搜索关键词: " + keyword); |
|||
// TODO: 调用 SearchService.searchByKeyword()
|
|||
} |
|||
|
|||
/** |
|||
* 处理 export 命令 |
|||
*/ |
|||
private void handleExportCommand(String[] args) { |
|||
if (args.length < 3) { |
|||
System.out.println("用法: export <笔记ID> <格式> <路径>"); |
|||
System.out.println("示例: export 123e4567 txt output.txt"); |
|||
System.out.println("支持格式: txt, json"); |
|||
return; |
|||
} |
|||
|
|||
String noteId = args[0]; |
|||
String format = args[1].toLowerCase(); |
|||
String filePath = args[2]; |
|||
|
|||
if (!format.equals("txt") && !format.equals("json")) { |
|||
System.out.println("不支持的格式: " + format); |
|||
System.out.println("支持格式: txt, json"); |
|||
return; |
|||
} |
|||
|
|||
System.out.println("导出笔记 " + noteId + " 为 " + format + " 格式到: " + filePath); |
|||
// TODO: 调用 ExporterFactory.createExporter() 和 export()
|
|||
} |
|||
|
|||
/** |
|||
* 处理 export-all 命令 |
|||
*/ |
|||
private void handleExportAllCommand(String[] args) { |
|||
if (args.length < 2) { |
|||
System.out.println("用法: export-all <格式> <路径>"); |
|||
System.out.println("示例: export-all json backup.json"); |
|||
System.out.println("支持格式: txt, json"); |
|||
return; |
|||
} |
|||
|
|||
String format = args[0].toLowerCase(); |
|||
String filePath = args[1]; |
|||
|
|||
if (!format.equals("txt") && !format.equals("json")) { |
|||
System.out.println("不支持的格式: " + format); |
|||
System.out.println("支持格式: txt, json"); |
|||
return; |
|||
} |
|||
|
|||
System.out.println("导出所有笔记为 " + format + " 格式到: " + filePath); |
|||
// TODO: 调用 ExporterFactory.createExporter() 和 exportAll()
|
|||
} |
|||
|
|||
/** |
|||
* 处理 help 命令 |
|||
*/ |
|||
private void handleHelpCommand() { |
|||
System.out.println("个人知识管理系统 - 命令行版本"); |
|||
System.out.println("=====================================\n"); |
|||
|
|||
System.out.println("可用命令:"); |
|||
System.out.println(" new <标题> <内容> - 创建新笔记"); |
|||
System.out.println(" list [--tag TAG] - 列出所有笔记"); |
|||
System.out.println(" view <笔记ID> - 查看笔记详情"); |
|||
System.out.println(" edit <笔记ID> <新内容> - 编辑笔记内容"); |
|||
System.out.println(" delete <笔记ID> - 删除笔记"); |
|||
System.out.println(" tag <笔记ID> <标签> - 添加标签"); |
|||
System.out.println(" untag <笔记ID> <标签> - 移除标签"); |
|||
System.out.println(" search <关键词> - 搜索笔记"); |
|||
System.out.println(" export <ID> <格式> <路径> - 导出笔记"); |
|||
System.out.println(" export-all <格式> <路径> - 导出所有笔记"); |
|||
System.out.println(" help - 显示此帮助信息"); |
|||
System.out.println(" exit - 退出程序\n"); |
|||
|
|||
System.out.println("示例:"); |
|||
System.out.println(" pkm new \"Java笔记\" \"面向对象编程的三大特性...\""); |
|||
System.out.println(" pkm list --tag java"); |
|||
System.out.println(" pkm view 123e4567"); |
|||
System.out.println(" pkm search \"设计模式\""); |
|||
System.out.println(" pkm export 123e4567 txt output.txt"); |
|||
} |
|||
|
|||
/** |
|||
* 处理 exit 命令 |
|||
*/ |
|||
private void handleExitCommand() { |
|||
System.out.println("感谢使用个人知识管理系统!"); |
|||
isRunning = false; |
|||
} |
|||
|
|||
/** |
|||
* 解析命令选项(如 --tag value) |
|||
*/ |
|||
private Map<String, String> parseOptions(String[] args) { |
|||
Map<String, String> options = new HashMap<>(); |
|||
|
|||
for (int i = 0; i < args.length; i++) { |
|||
if (args[i].startsWith("--")) { |
|||
String key = args[i].substring(2); |
|||
if (i + 1 < args.length && !args[i + 1].startsWith("--")) { |
|||
options.put(key, args[i + 1]); |
|||
i++; // 跳过值参数
|
|||
} else { |
|||
options.put(key, "true"); |
|||
} |
|||
} |
|||
} |
|||
|
|||
return options; |
|||
} |
|||
|
|||
/** |
|||
* 关闭资源 |
|||
*/ |
|||
public void close() { |
|||
if (scanner != null) { |
|||
scanner.close(); |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,7 @@ |
|||
package com.example.model; |
|||
|
|||
public enum ExportFormat { |
|||
TXT, |
|||
JSON, |
|||
PDF |
|||
} |
|||
Loading…
Reference in new issue