4 changed files with 130 additions and 0 deletions
@ -0,0 +1,33 @@ |
|||||
|
package com.example.moviecli.command; |
||||
|
|
||||
|
import com.example.moviecli.repository.MovieRepository; |
||||
|
import com.example.moviecli.view.ConsoleView; |
||||
|
|
||||
|
public class HelpCommand implements Command { |
||||
|
private final ConsoleView view; |
||||
|
|
||||
|
public HelpCommand(ConsoleView view) { |
||||
|
this.view = view; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public String getName() { |
||||
|
return "help"; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public void execute(String[] args, MovieRepository repository) { |
||||
|
view.printInfo("可用命令:"); |
||||
|
view.printInfo(" crawl <url> - 爬取指定网站的数据"); |
||||
|
view.printInfo(" list - 列出所有记录"); |
||||
|
view.printInfo(" search <词> - 按标题搜索"); |
||||
|
view.printInfo(" stat - 统计评分分布"); |
||||
|
view.printInfo(" export - 导出为 movies.csv"); |
||||
|
view.printInfo(" help - 显示本帮助"); |
||||
|
view.printInfo(" exit - 退出程序"); |
||||
|
view.printInfo("\n支持的 URL 示例:"); |
||||
|
view.printInfo(" https://movie.douban.com/top250"); |
||||
|
view.printInfo(" https://news.sina.com.cn/"); |
||||
|
view.printInfo(" https://book.douban.com/top250"); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,29 @@ |
|||||
|
package com.example.moviecli.command; |
||||
|
|
||||
|
import com.example.moviecli.repository.MovieRepository; |
||||
|
import com.example.moviecli.view.ConsoleView; |
||||
|
import com.example.moviecli.model.Movie; |
||||
|
public class ListCommand implements Command { |
||||
|
private final ConsoleView view; |
||||
|
|
||||
|
public ListCommand(ConsoleView view) { |
||||
|
this.view = view; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public String getName() { |
||||
|
return "list"; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public void execute(String[] args, MovieRepository repository) { |
||||
|
var movies = repository.getAll(); |
||||
|
if (movies.isEmpty()) { |
||||
|
view.printInfo("暂无数据,请先执行 crawl <url>。"); |
||||
|
return; |
||||
|
} |
||||
|
for (Movie m : movies) { |
||||
|
System.out.println(m.getRank() + ". " + m.getTitle() + " - " + m.getScore()); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,35 @@ |
|||||
|
package com.example.moviecli.command; |
||||
|
|
||||
|
import com.example.moviecli.model.Movie; |
||||
|
import com.example.moviecli.repository.MovieRepository; |
||||
|
import com.example.moviecli.view.ConsoleView; |
||||
|
|
||||
|
public class SearchCommand implements Command { |
||||
|
private final ConsoleView view; |
||||
|
|
||||
|
public SearchCommand(ConsoleView view) { |
||||
|
this.view = view; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public String getName() { |
||||
|
return "search"; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public void execute(String[] args, MovieRepository repository) { |
||||
|
if (args.length < 2) { |
||||
|
view.printError("用法: search <关键词>"); |
||||
|
return; |
||||
|
} |
||||
|
String keyword = args[1].toLowerCase(); |
||||
|
var result = repository.getAll().stream() |
||||
|
.filter(m -> m.getTitle().toLowerCase().contains(keyword)) |
||||
|
.toList(); |
||||
|
if (result.isEmpty()) { |
||||
|
view.printInfo("没有找到包含 \"" + keyword + "\" 的记录。"); |
||||
|
} else { |
||||
|
result.forEach(m -> System.out.println(m.getRank() + ". " + m.getTitle() + " - " + m.getScore())); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,33 @@ |
|||||
|
package com.example.moviecli.command; |
||||
|
|
||||
|
import com.example.moviecli.repository.MovieRepository; |
||||
|
import com.example.moviecli.view.ConsoleView; |
||||
|
import java.util.Map; |
||||
|
import java.util.stream.Collectors; |
||||
|
import com.example.moviecli.model.Movie; |
||||
|
public class StatCommand implements Command { |
||||
|
private final ConsoleView view; |
||||
|
|
||||
|
public StatCommand(ConsoleView view) { |
||||
|
this.view = view; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public String getName() { |
||||
|
return "stat"; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public void execute(String[] args, MovieRepository repository) { |
||||
|
var movies = repository.getAll(); |
||||
|
if (movies.isEmpty()) { |
||||
|
view.printInfo("无数据,请先 crawl。"); |
||||
|
return; |
||||
|
} |
||||
|
Map<String, Long> scoreCount = movies.stream() |
||||
|
.collect(Collectors.groupingBy(Movie::getScore, Collectors.counting())); |
||||
|
view.printInfo("评分分布:"); |
||||
|
scoreCount.forEach((score, count) -> |
||||
|
System.out.println(score + " 分 -> " + count + " 条")); |
||||
|
} |
||||
|
} |
||||
Loading…
Reference in new issue