feat: 功能迁移

develop
peterpan 7 months ago
parent daeec9438e
commit d429dcb895

@ -1,4 +1,5 @@
import auth.AuthService;
import utils.TestPaperService;
import model.Level;
import model.User;
@ -6,7 +7,7 @@ import java.util.Scanner;
public class Main {
private static final AuthService authService = new AuthService();
private static final AuthService.TestPaperService testPaperService = new AuthService.TestPaperService();
private static final utils.TestPaperService testPaperService = new utils.TestPaperService();
private static User currentUser = null;
private static Level currentLevel = null;
@ -22,17 +23,23 @@ public class Main {
}
private static void handleLogin(Scanner scanner) {
System.out.println("**********数学试卷生成项目**********");
System.out.println("请输入用户名和密码,用空格隔开:");
String[] input = scanner.nextLine().split(" ");
System.out.println("请输入用户名和密码,用空格隔开 (输入 'exit' 退出程序):");
String line = scanner.nextLine();
if ("exit".equalsIgnoreCase(line)) {
System.out.println("感谢使用,程序已退出。");
System.exit(0);
}
String[] input = line.split(" ");
if (input.length == 2) {
authService.login(input[0], input[1]).ifPresentOrElse(
user -> {
currentUser = user;
currentLevel = user.getLevel();
System.out.printf("当前选择为%s出题%n", currentLevel.getName()); // 登录成功提示
System.out.printf("当前选择为%s出题%n", currentLevel.getName());
},
() -> System.out.println("请输入正确的用户名、密码") // 登录失败提示
() -> System.out.println("请输入正确的用户名、密码")
);
} else {
System.out.println("输入格式不正确,请重新输入。");
@ -40,7 +47,7 @@ public class Main {
}
private static void handleQuestionGeneration(Scanner scanner) {
System.out.printf("准备生成%s数学题目, 请输入生成题目数量(输入-1将退出当前用户, 重新登录):%n", currentLevel.getName()); // 生成提示
System.out.printf("准备生成%s数学题目, 请输入生成题目数量(可输入“切换为(小学/初中/高中)”;输入-1将退出当前用户, 重新登录):%n", currentLevel.getName()); // 生成提示
String input = scanner.nextLine();
if (input.startsWith("切换为")) { // 切换类型功能
@ -69,10 +76,9 @@ public class Main {
Level newLevel = Level.fromString(levelStr);
if (newLevel != null) {
currentLevel = newLevel;
// 正确切换后,不立即生成,而是回到数量输入提示
System.out.printf("切换成功!%n");
System.out.printf("系统提示“准备生成%s数学题目, 请输入生成题目数量”%n", currentLevel.getName());
} else {
System.out.println("请输入小学、初中和高中三个选项中的一个"); // 切换输入错误提示
System.out.println("请输入小学、初中和高中三个选项中的一个");
}
}
}

@ -1,26 +1,17 @@
package auth;
import generator.IQuestionGenerator;
import model.Level;
import model.User;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.stream.Stream;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
public class AuthService {
private final List<User> users;
public AuthService() {
this.users = new ArrayList<>();
// 初始化用户账户
users.add(new User("张三1", "123", Level.ELEMENTARY));
users.add(new User("张三2", "123", Level.ELEMENTARY));
users.add(new User("张三3", "123", Level.ELEMENTARY));
@ -37,62 +28,4 @@ public class AuthService {
.filter(user -> user.getUsername().equals(username) && user.getPassword().equals(password))
.findFirst();
}
public static class TestPaperService {
public Set<String> loadExistingQuestions(String username) {
Set<String> questions = new HashSet<>();
File userDir = new File(username);
if (!userDir.exists() || !userDir.isDirectory()) {
return questions;
}
try (Stream<Path> paths = Files.walk(Paths.get(username))) {
paths.filter(Files::isRegularFile)
.filter(path -> path.toString().endsWith(".txt"))
.forEach(path -> {
try {
Files.lines(path).forEach(line -> {
// 简单的题目提取逻辑,假设每行都是一个题目
if (line.matches("^\\d+\\.\\s.*")) {
questions.add(line.substring(line.indexOf(' ') + 1).trim());
}
});
} catch (IOException e) {
System.err.println("读取历史文件失败: " + path);
}
});
} catch (IOException e) {
System.err.println("加载历史题目时出错: " + e.getMessage());
}
return questions;
}
public void generateAndSave(User user, Level level, int count) {
// IQuestionGenerator generator = createGenerator(level);
Set<String> existingQuestions = loadExistingQuestions(user.getUsername());
// 创建用户文件夹
File userDir = new File(user.getUsername());
if (!userDir.exists()) {
userDir.mkdirs();
}
// 定义文件名格式
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd-HH-mm-ss");
String fileName = LocalDateTime.now().format(formatter) + ".txt";
try (PrintWriter writer = new PrintWriter(new File(userDir, fileName))) {
for (int i = 0; i < count; i++) {
String question = generator.generate(existingQuestions);
existingQuestions.add(question); // 添加到集合中,防止本次生成重复
writer.println((i + 1) + ". " + question); // 每道题目有题号
writer.println(); // 每题之间空一行
}
System.out.println("成功生成卷子: " + userDir.getAbsolutePath() + File.separator + fileName);
} catch (IOException e) {
System.err.println("保存文件时出错: " + e.getMessage());
}
}
}
}
}

@ -0,0 +1,98 @@
package utils;
import generator.IQuestionGenerator;
import model.Level;
import model.User;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.nio.file.Files;
import java.nio.file.Path;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.HashSet;
import java.util.Set;
public class TestPaperService {
public void generateAndSave(User user, Level level, int count) {
Set<String> existingQuestions = loadExistingQuestions(user.getUsername());
System.out.println("检测到历史题目 " + existingQuestions.size() + " 道。");
// IQuestionGenerator generator = createGenerator(level);
Set<String> newQuestions = new HashSet<>();
// 生成新的、与历史和本次不重复的题目
for (int i = 0; i < count; i++) {
Set<String> used = new HashSet<>(existingQuestions);
used.addAll(newQuestions);
// String question = generator.generate(used);
// newQuestions.add(question);
}
saveToFile(user.getUsername(), newQuestions);
}
private Set<String> loadExistingQuestions(String username) {
Set<String> existingQuestions = new HashSet<>();
File userDir = new File(username);
if (!userDir.exists() || !userDir.isDirectory()) {
return existingQuestions;
}
File[] files = userDir.listFiles((dir, name) -> name.toLowerCase().endsWith(".txt"));
if (files == null) {
return existingQuestions;
}
for (File file : files) {
try {
Files.lines(file.toPath()).forEach(line -> {
if (line.matches("^\\d+\\.\\s.*")) {
String question = line.substring(line.indexOf(' ') + 1).trim();
existingQuestions.add(question);
}
});
} catch (IOException e) {
System.err.println("错误:读取历史文件失败: " + file.getName());
}
}
return existingQuestions;
}
private void saveToFile(String username, Set<String> questions) {
File userDir = new File(username);
if (!userDir.exists()) {
userDir.mkdirs();
}
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd-HH-mm-ss");
String fileName = LocalDateTime.now().format(formatter) + ".txt";
Path filePath = userDir.toPath().resolve(fileName);
try (PrintWriter writer = new PrintWriter(Files.newBufferedWriter(filePath))) {
int questionNumber = 1;
for (String question : questions) {
writer.println(questionNumber + ". " + question);
writer.println();
questionNumber++;
}
System.out.println("成功生成卷子,已保存至: " + filePath.toAbsolutePath());
} catch (IOException e) {
System.err.println("错误:保存文件时出错: " + e.getMessage());
}
}
// private IQuestionGenerator createGenerator(Level level) {
// switch (level) {
// case JUNIOR_HIGH:
// return new JuniorHighGenerator();
// case SENIOR_HIGH:
// return new SeniorHighGenerator();
// case ELEMENTARY:
// default:
// return new ElementarySchoolGenerator();
// }
// }
}
Loading…
Cancel
Save