diff --git a/w10/Command.java b/w10/Command.java new file mode 100644 index 0000000..d7fb397 --- /dev/null +++ b/w10/Command.java @@ -0,0 +1,9 @@ +package command; + +import repository.PaperRepository; + +public interface Command { + void execute(String[] args, PaperRepository repository); + String getDescription(); + String getName(); +} \ No newline at end of file diff --git a/w10/CrawlCommand.java b/w10/CrawlCommand.java new file mode 100644 index 0000000..8d9cfa8 --- /dev/null +++ b/w10/CrawlCommand.java @@ -0,0 +1,73 @@ +package command; + +import model.Paper; +import strategy.CrawlerStrategy; +import strategy.StrategyFactory; +import repository.PaperRepository; +import view.ConsoleView; +import java.util.List; + +public class CrawlCommand implements Command { + private ConsoleView view; + private StrategyFactory strategyFactory; + + public CrawlCommand(ConsoleView view, StrategyFactory strategyFactory) { + this.view = view; + this.strategyFactory = strategyFactory; + } + + @Override + public void execute(String[] args, PaperRepository repository) { + if (args.length < 2) { + view.showError("请提供要爬取的论文网站URL,格式: crawl "); + return; + } + + String url = args[1]; + + if (!isValidUrl(url)) { + view.showError("无效的URL格式,请提供有效的论文网站URL"); + return; + } + + try { + view.showInfo("开始爬取论文..."); + view.showInfo("目标URL: " + url); + + CrawlerStrategy crawler = strategyFactory.createCrawlerByUrl(url); + if (crawler == null) { + view.showError("不支持的网站,请提供支持的论文网站URL"); + return; + } + + String platformName = crawler.getPlatformName(); + repository.init(platformName); + + List papers = crawler.crawl(url, 10); + + if (papers.isEmpty()) { + view.showInfo("未获取到论文"); + } else { + List uniquePapers = repository.removeDuplicates(papers); + repository.savePapers(uniquePapers); + view.showSuccess("成功爬取 " + uniquePapers.size() + " 篇论文"); + } + } catch (Exception e) { + view.showError("爬取失败: " + e.getMessage()); + } + } + + private boolean isValidUrl(String url) { + return url != null && (url.startsWith("http://") || url.startsWith("https://")); + } + + @Override + public String getDescription() { + return "爬取指定URL的论文,格式: crawl <论文网站URL>"; + } + + @Override + public String getName() { + return "crawl"; + } +} \ No newline at end of file diff --git a/w10/ExitCommand.java b/w10/ExitCommand.java new file mode 100644 index 0000000..0f1b49a --- /dev/null +++ b/w10/ExitCommand.java @@ -0,0 +1,28 @@ +package command; + +import view.ConsoleView; +import repository.PaperRepository; + +public class ExitCommand implements Command { + private ConsoleView view; + + public ExitCommand(ConsoleView view) { + this.view = view; + } + + @Override + public void execute(String[] args, PaperRepository repository) { + view.showSuccess("程序已退出"); + System.exit(0); + } + + @Override + public String getDescription() { + return "退出程序"; + } + + @Override + public String getName() { + return "exit"; + } +} \ No newline at end of file diff --git a/w10/HelpCommand.java b/w10/HelpCommand.java new file mode 100644 index 0000000..d98f542 --- /dev/null +++ b/w10/HelpCommand.java @@ -0,0 +1,33 @@ +package command; + +import view.ConsoleView; +import java.util.List; +import repository.PaperRepository; + +public class HelpCommand implements Command { + private ConsoleView view; + private List commands; + + public HelpCommand(ConsoleView view, List commands) { + this.view = view; + this.commands = commands; + } + + @Override + public void execute(String[] args, PaperRepository repository) { + view.showInfo("可用命令:"); + for (Command command : commands) { + view.showCommandInfo(command); + } + } + + @Override + public String getDescription() { + return "显示帮助信息"; + } + + @Override + public String getName() { + return "help"; + } +} \ No newline at end of file diff --git a/w10/ListCommand.java b/w10/ListCommand.java new file mode 100644 index 0000000..574ca06 --- /dev/null +++ b/w10/ListCommand.java @@ -0,0 +1,64 @@ +package command; + +import model.Paper; +import repository.PaperRepository; +import view.ConsoleView; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; + +public class ListCommand implements Command { + private ConsoleView view; + + public ListCommand(ConsoleView view) { + this.view = view; + } + + @Override + public void execute(String[] args, PaperRepository repository) { + try { + Map> papersByPlatform = repository.loadAllPapersGroupedByPlatform(); + + if (papersByPlatform.isEmpty()) { + view.showInfo("暂无论文,请先执行 crawl 命令爬取论文"); + } else { + int totalCount = 0; + for (Entry> entry : papersByPlatform.entrySet()) { + totalCount += entry.getValue().size(); + } + + view.showInfo("当前已获取 " + totalCount + " 篇论文,分布在 " + papersByPlatform.size() + " 个平台:"); + System.out.println(); + + int globalIndex = 1; + for (Entry> entry : papersByPlatform.entrySet()) { + String platformName = entry.getKey(); + List papers = entry.getValue(); + + System.out.println("【" + platformName + "】 (" + papers.size() + " 篇)"); + System.out.println("-".repeat(50)); + + for (int i = 0; i < papers.size(); i++) { + Paper paper = papers.get(i); + view.showPaperInfo(globalIndex, paper); + globalIndex++; + } + + System.out.println(); + } + } + } catch (Exception e) { + view.showError("查询失败: " + e.getMessage()); + } + } + + @Override + public String getDescription() { + return "查询已获取的论文列表"; + } + + @Override + public String getName() { + return "list"; + } +} \ No newline at end of file