import java.time.LocalDate; import java.util.List; /** * CrawlCommand: 抓取文章并存入列表 * 选做:支持别名 "c" 代替 "crawl" */ public class CrawlCommand implements Command { private final ConsoleView view; public CrawlCommand(ConsoleView v) { this.view = v; } @Override public String getName() { return "crawl"; } // 选做:别名支持(由 Controller 注册两个 key 指向同一实例) public String getAlias() { return "c"; } @Override public void execute(String[] args, List
articles) { // 参数校验 if (args.length < 2 || args[1].isBlank()) { view.printError("用法:crawl 或 c "); return; } String url = args[1].trim(); // 选做:URL 格式校验 if (!isValidUrl(url)) { view.printError("URL 格式不合法,请以 http:// 或 https:// 开头:" + url); return; } // Stub:模拟抓取(真实爬取留待后续实现) // 注意:字符串拼接仅用于构建提示信息(View 层职责), // 业务数据直接封装进 Article,不在 Command 层做字符串展示拼接。 Article article = new Article( "抓取文章 - " + extractDomain(url), url, "(stub content)", "unknown", LocalDate.now() ); articles.add(article); view.printSuccess("已抓取:" + article.getTitle() + " [" + url + "]"); } /** 选做:简单 URL 格式验证 */ private boolean isValidUrl(String url) { return url.startsWith("http://") || url.startsWith("https://"); } private String extractDomain(String url) { try { String stripped = url.replaceFirst("https?://", ""); int slash = stripped.indexOf('/'); return slash > 0 ? stripped.substring(0, slash) : stripped; } catch (Exception e) { return url; } } }