Browse Source

宋瑞-202506050301

main
Songrui 3 weeks ago
parent
commit
6b011fda60
  1. BIN
      w9/AI审计架构.png
  2. 4
      w9/java-cli/.gitignore
  3. 13
      w9/java-cli/.idea/compiler.xml
  4. 20
      w9/java-cli/.idea/jarRepositories.xml
  5. 12
      w9/java-cli/.idea/misc.xml
  6. 57
      w9/java-cli/.idea/workspace.xml
  7. 45
      w9/java-cli/pom.xml
  8. 22
      w9/java-cli/src/main/java/com/example/datacollect/Main.java
  9. 9
      w9/java-cli/src/main/java/com/example/datacollect/command/Command.java
  10. 40
      w9/java-cli/src/main/java/com/example/datacollect/command/CrawlCommand.java
  11. 24
      w9/java-cli/src/main/java/com/example/datacollect/command/ExitCommand.java
  12. 23
      w9/java-cli/src/main/java/com/example/datacollect/command/HelpCommand.java
  13. 31
      w9/java-cli/src/main/java/com/example/datacollect/command/HistoryCommand.java
  14. 23
      w9/java-cli/src/main/java/com/example/datacollect/command/ListCommand.java
  15. 55
      w9/java-cli/src/main/java/com/example/datacollect/controller/CrawlerController.java
  16. 73
      w9/java-cli/src/main/java/com/example/datacollect/model/Article.java
  17. 43
      w9/java-cli/src/main/java/com/example/datacollect/view/ConsoleView.java
  18. BIN
      w9/思考题.png

BIN
w9/AI审计架构.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 218 KiB

4
w9/java-cli/.gitignore

@ -0,0 +1,4 @@
*.jar
*.class
*.log
target/

13
w9/java-cli/.idea/compiler.xml

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<annotationProcessing>
<profile name="Maven default annotation processors profile" enabled="true">
<sourceOutputDir name="target/generated-sources/annotations" />
<sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
<outputRelativeToContentRoot value="true" />
<module name="datacollect-cli" />
</profile>
</annotationProcessing>
</component>
</project>

20
w9/java-cli/.idea/jarRepositories.xml

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RemoteRepositoriesConfiguration">
<remote-repository>
<option name="id" value="central" />
<option name="name" value="Central Repository" />
<option name="url" value="https://repo.maven.apache.org/maven2" />
</remote-repository>
<remote-repository>
<option name="id" value="central" />
<option name="name" value="Maven Central repository" />
<option name="url" value="https://repo1.maven.org/maven2" />
</remote-repository>
<remote-repository>
<option name="id" value="jboss.community" />
<option name="name" value="JBoss Community repository" />
<option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
</remote-repository>
</component>
</project>

12
w9/java-cli/.idea/misc.xml

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="MavenProjectsManager">
<option name="originalFiles">
<list>
<option value="$PROJECT_DIR$/pom.xml" />
</list>
</option>
</component>
<component name="ProjectRootManager" version="2" project-jdk-name="openjdk-25" project-jdk-type="JavaSDK" />
</project>

57
w9/java-cli/.idea/workspace.xml

@ -0,0 +1,57 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="AutoImportSettings">
<option name="autoReloadType" value="SELECTIVE" />
</component>
<component name="ChangeListManager">
<list default="true" id="c7ba6168-6635-409d-b8c1-a23b46e924d0" name="更改" comment="" />
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
<option name="LAST_RESOLUTION" value="IGNORE" />
</component>
<component name="ProjectColorInfo">{
&quot;associatedIndex&quot;: 1
}</component>
<component name="ProjectId" id="3EMFq5Qtu4YwAdKlGou0LU7NjKO" />
<component name="ProjectViewState">
<option name="hideEmptyMiddlePackages" value="true" />
<option name="showLibraryContents" value="true" />
</component>
<component name="PropertiesComponent">{
&quot;keyToString&quot;: {
&quot;ModuleVcsDetector.initialDetectionPerformed&quot;: &quot;true&quot;,
&quot;RunOnceActivity.ShowReadmeOnStart&quot;: &quot;true&quot;,
&quot;RunOnceActivity.typescript.service.memoryLimit.init&quot;: &quot;true&quot;,
&quot;kotlin-language-version-configured&quot;: &quot;true&quot;,
&quot;last_opened_file_path&quot;: &quot;D:/桌面/java-cli&quot;,
&quot;nodejs_package_manager_path&quot;: &quot;npm&quot;,
&quot;vue.rearranger.settings.migration&quot;: &quot;true&quot;
}
}</component>
<component name="SharedIndexes">
<attachedChunks>
<set>
<option value="bundled-jdk-30f59d01ecdd-2fc7cc6b9a17-intellij.indexing.shared.core-IU-253.31033.145" />
<option value="bundled-js-predefined-d6986cc7102b-9b0f141eb926-JavaScript-IU-253.31033.145" />
</set>
</attachedChunks>
</component>
<component name="TaskManager">
<task active="true" id="Default" summary="默认任务">
<changelist id="c7ba6168-6635-409d-b8c1-a23b46e924d0" name="更改" comment="" />
<created>1779980718835</created>
<option name="number" value="Default" />
<option name="presentableId" value="Default" />
<updated>1779980718835</updated>
<workItem from="1779980719996" duration="984000" />
<workItem from="1779986384307" duration="20000" />
<workItem from="1779986887116" duration="2205000" />
<workItem from="1780029366756" duration="19000" />
</task>
<servers />
</component>
<component name="TypeScriptGeneratedFilesManager">
<option name="version" value="3" />
</component>
</project>

45
w9/java-cli/pom.xml

@ -0,0 +1,45 @@
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>datacollect-cli</artifactId>
<version>0.1.0</version>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.3.0</version>
<configuration>
<archive>
<manifest>
<mainClass>com.example.datacollect.Main</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

22
w9/java-cli/src/main/java/com/example/datacollect/Main.java

@ -0,0 +1,22 @@
package com.example.datacollect;
import com.example.datacollect.controller.CrawlerController;
import com.example.datacollect.model.Article;
import com.example.datacollect.view.ConsoleView;
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
ConsoleView view = new ConsoleView();
List<Article> articles = new ArrayList<>();
List<String> history = new ArrayList<>();
CrawlerController controller = new CrawlerController(view, articles, history);
view.printSuccess("Welcome to CLI Crawler (w9_1)! Type help for commands.");
while (true) {
controller.handle(view.readLine());
}
}
}

9
w9/java-cli/src/main/java/com/example/datacollect/command/Command.java

@ -0,0 +1,9 @@
package com.example.datacollect.command;
import com.example.datacollect.model.Article;
import java.util.List;
public interface Command {
String getName();
void execute(String[] args, List<Article> articles);
}

40
w9/java-cli/src/main/java/com/example/datacollect/command/CrawlCommand.java

@ -0,0 +1,40 @@
package com.example.datacollect.command;
import com.example.datacollect.model.Article;
import com.example.datacollect.view.ConsoleView;
import java.util.List;
import java.util.regex.Pattern;
public class CrawlCommand implements Command {
private final ConsoleView view;
private static final Pattern URL_PATTERN = Pattern.compile(
"^https?://[a-zA-Z0-9][a-zA-Z0-9-]*\\.[a-zA-Z]{2,}(/[^\\s]*)?$"
);
public CrawlCommand(ConsoleView view) {
this.view = view;
}
@Override
public String getName() {
return "crawl";
}
private boolean isValidUrl(String url) {
return url != null && URL_PATTERN.matcher(url).matches();
}
@Override
public void execute(String[] args, List<Article> articles) {
if (args.length < 2) {
view.printError("Usage: crawl <url>");
return;
}
String url = args[1];
if (!isValidUrl(url)) {
view.printError("Invalid URL format. Only HTTP/HTTPS URLs are allowed.");
return;
}
view.printInfo("Stub: would crawl " + url);
}
}

24
w9/java-cli/src/main/java/com/example/datacollect/command/ExitCommand.java

@ -0,0 +1,24 @@
package com.example.datacollect.command;
import com.example.datacollect.model.Article;
import com.example.datacollect.view.ConsoleView;
import java.util.List;
public class ExitCommand implements Command {
private final ConsoleView view;
public ExitCommand(ConsoleView view) {
this.view = view;
}
@Override
public String getName() {
return "exit";
}
@Override
public void execute(String[] args, List<Article> articles) {
view.printSuccess("Bye!");
System.exit(0);
}
}

23
w9/java-cli/src/main/java/com/example/datacollect/command/HelpCommand.java

@ -0,0 +1,23 @@
package com.example.datacollect.command;
import com.example.datacollect.model.Article;
import com.example.datacollect.view.ConsoleView;
import java.util.List;
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, List<Article> articles) {
view.printInfo("Commands: crawl <url>, list, help, exit, history, (c as alias for crawl)");
}
}

31
w9/java-cli/src/main/java/com/example/datacollect/command/HistoryCommand.java

@ -0,0 +1,31 @@
package com.example.datacollect.command;
import com.example.datacollect.model.Article;
import com.example.datacollect.view.ConsoleView;
import java.util.List;
public class HistoryCommand implements Command {
private final ConsoleView view;
private final List<String> history;
public HistoryCommand(ConsoleView view, List<String> history) {
this.view = view;
this.history = history;
}
@Override
public String getName() {
return "history";
}
@Override
public void execute(String[] args, List<Article> articles) {
if (history.isEmpty()) {
view.printInfo("No command history.");
return;
}
for (int i = 0; i < history.size(); i++) {
view.printInfo((i + 1) + ". " + history.get(i));
}
}
}

23
w9/java-cli/src/main/java/com/example/datacollect/command/ListCommand.java

@ -0,0 +1,23 @@
package com.example.datacollect.command;
import com.example.datacollect.model.Article;
import com.example.datacollect.view.ConsoleView;
import java.util.List;
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, List<Article> articles) {
view.display(articles);
}
}

55
w9/java-cli/src/main/java/com/example/datacollect/controller/CrawlerController.java

@ -0,0 +1,55 @@
package com.example.datacollect.controller;
import com.example.datacollect.command.Command;
import com.example.datacollect.command.CrawlCommand;
import com.example.datacollect.command.ExitCommand;
import com.example.datacollect.command.HelpCommand;
import com.example.datacollect.command.HistoryCommand;
import com.example.datacollect.command.ListCommand;
import com.example.datacollect.model.Article;
import com.example.datacollect.view.ConsoleView;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class CrawlerController {
private final Map<String, Command> commands = new HashMap<>();
private final Map<String, String> aliases = new HashMap<>();
private final ConsoleView view;
private final List<Article> articles;
private final List<String> history;
public CrawlerController(ConsoleView view, List<Article> articles, List<String> history) {
this.view = view;
this.articles = articles;
this.history = history;
register(new HelpCommand(view));
register(new ListCommand(view));
register(new CrawlCommand(view));
register(new ExitCommand(view));
register(new HistoryCommand(view, history));
aliases.put("c", "crawl");
}
private void register(Command command) {
commands.put(command.getName(), command);
}
public void handle(String input) {
String text = input == null ? "" : input.trim();
if (text.isEmpty()) {
return;
}
history.add(text);
String[] args = text.split("\\s+");
String cmdName = args[0].toLowerCase();
cmdName = aliases.getOrDefault(cmdName, cmdName);
Command command = commands.get(cmdName);
if (command == null) {
view.printError("Unknown command: " + cmdName);
return;
}
command.execute(args, articles);
}
}

73
w9/java-cli/src/main/java/com/example/datacollect/model/Article.java

@ -0,0 +1,73 @@
package com.example.datacollect.model;
import java.time.LocalDate;
public class Article {
private String title;
private String url;
private String content;
private String author;
private LocalDate publishDate;
public Article(String title, String url, String content) {
this.title = title;
this.url = url;
this.content = content;
}
public Article(String title, String url, String content, String author, LocalDate publishDate) {
this.title = title;
this.url = url;
this.content = content;
this.author = author;
this.publishDate = publishDate;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public LocalDate getPublishDate() {
return publishDate;
}
public void setPublishDate(LocalDate publishDate) {
this.publishDate = publishDate;
}
@Override
public String toString() {
return "Article{"
+ "title='" + title + '\''
+ ", url='" + url + '\''
+ '}';
}
}

43
w9/java-cli/src/main/java/com/example/datacollect/view/ConsoleView.java

@ -0,0 +1,43 @@
package com.example.datacollect.view;
import com.example.datacollect.model.Article;
import java.util.List;
import java.util.Scanner;
public class ConsoleView {
private static final boolean DARK_MODE = true;
private static final String ANSI_RESET = "\u001B[0m";
private static final String ANSI_GREEN = DARK_MODE ? "\u001B[92m" : "\u001B[32m";
private static final String ANSI_RED = DARK_MODE ? "\u001B[91m" : "\u001B[31m";
private static final String ANSI_BLUE = DARK_MODE ? "\u001B[94m" : "\u001B[34m";
private final Scanner scanner = new Scanner(System.in);
public String readLine() {
System.out.print("> ");
return scanner.nextLine();
}
public void printSuccess(String msg) {
System.out.println(ANSI_GREEN + msg + ANSI_RESET);
}
public void printError(String msg) {
System.out.println(ANSI_RED + msg + ANSI_RESET);
}
public void printInfo(String msg) {
System.out.println(ANSI_BLUE + msg + ANSI_RESET);
}
public void display(List<Article> articles) {
if (articles.isEmpty()) {
printInfo("暂无文章,请先执行 crawl。");
return;
}
for (int i = 0; i < articles.size(); i++) {
Article a = articles.get(i);
System.out.println((i + 1) + ". " + a.getTitle() + " | " + a.getUrl());
}
}
}

BIN
w9/思考题.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 114 KiB

Loading…
Cancel
Save