Browse Source

上传文件至 'w10'

main
Zhengjie 1 month ago
parent
commit
232cc5cee6
  1. 9
      w10/Command.java
  2. 73
      w10/CrawlCommand.java
  3. 28
      w10/ExitCommand.java
  4. 33
      w10/HelpCommand.java
  5. 64
      w10/ListCommand.java

9
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();
}

73
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 <URL>");
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<Paper> papers = crawler.crawl(url, 10);
if (papers.isEmpty()) {
view.showInfo("未获取到论文");
} else {
List<Paper> 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";
}
}

28
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";
}
}

33
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<Command> commands;
public HelpCommand(ConsoleView view, List<Command> 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";
}
}

64
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<String, List<Paper>> papersByPlatform = repository.loadAllPapersGroupedByPlatform();
if (papersByPlatform.isEmpty()) {
view.showInfo("暂无论文,请先执行 crawl 命令爬取论文");
} else {
int totalCount = 0;
for (Entry<String, List<Paper>> entry : papersByPlatform.entrySet()) {
totalCount += entry.getValue().size();
}
view.showInfo("当前已获取 " + totalCount + " 篇论文,分布在 " + papersByPlatform.size() + " 个平台:");
System.out.println();
int globalIndex = 1;
for (Entry<String, List<Paper>> entry : papersByPlatform.entrySet()) {
String platformName = entry.getKey();
List<Paper> 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";
}
}
Loading…
Cancel
Save