稳定版本 #4

Merged
hnu202326010318 merged 2 commits from develop into main 4 months ago

@ -16,7 +16,7 @@
## 技术栈
* **开发语言**Java 23
* **开发语言**Java 21(及更高版本)
* **构建工具**Apache Maven
## 如何启动
@ -26,7 +26,7 @@
### 1\. 环境要求
* `JAVA_HOME` 环境变量已正确设置。
* `mvn` 命令可在您的终端或命令行中正常使用。
* **全平台通用**
### 2\. 构建项目
@ -38,14 +38,14 @@
mvn clean package
```
该命令会编译所有代码,并 T 在 `target/` 目录下生成一个名为 `MathGenerator-1.0.0.jar` 的文件。
该命令会编译所有代码,并 T 在 `target/` 目录下生成一个名为 `mathgenerator.jar` 的文件。
### 3\. 运行程序
构建成功后,使用以下命令来启动程序:
```bash
java -jar target/MathGenerator-1.0.0.jar
java -jar mathgenerator.jar
```
如果一切顺利,您将在终端看到欢迎界面和用户登录提示。
@ -57,19 +57,24 @@ java -jar target/MathGenerator-1.0.0.jar
```
.
├── pom.xml # Maven 核心配置文件
├── users.json # 用户数据文件
└── src
└── main
└── java
└── com
└── mathgenerator
├── Application.java # 程序主入口
├── auth/ # 用户认证模块
├── model/ # 数据模型(枚举)
├── generator/ # 各级题目生成器
├── storage/ # 文件存储与查重
├── service/ # 核心业务服务与策略
│ ├── PaperService.java
│ └── strategy/
└── ui/ # 命令行UI界面处理
└── ConsoleUI.java
├── Application.java # 程序主入口:负责组装和启动
├── model/ # 数据模型包
├── ui/ # 用户界面包
|
├── storage/ # 存储包
├── generator/ # 题目生成器包
└── service/ # 核心业务服务包
└── strategy/ # 试卷组合策略子包
```

@ -111,10 +111,10 @@
mvn clean package
```
该命令会自动完成编译、测试和打包,并在 `target/` 目录下生成一个可执行的 `MathGenerator-1.0.0.jar` 文件。
该命令会自动完成编译、测试和打包,并在 `target/` 目录下生成一个可执行的 `mathgenerator.jar` 文件。
2. **运行**: 继续在终端中执行以下命令来启动程序。
```bash
java -jar target/MathGenerator-1.0.0.jar
java -jar mathgenerator.jar
```

@ -18,22 +18,50 @@
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.10.1</version> </dependency>
<version>2.10.1</version>
</dependency>
</dependencies>
<build>
<plugins>
<!-- 禁用默认的 maven-jar-plugin 生成基础JAR -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.3.0</version>
<executions>
<execution>
<id>default-jar</id>
<phase>none</phase> <!-- 移除默认的打包阶段不生成基础JAR -->
</execution>
</executions>
</plugin>
<!-- 仅保留 assembly 插件生成自定义JAR -->
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.6.0</version>
<configuration>
<archive>
<manifest>
<mainClass>com.mathgenerator.Application</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<finalName>mathgenerator</finalName> <!-- 自定义文件名 -->
<appendAssemblyId>false</appendAssemblyId> <!-- 去掉后缀 -->
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>

@ -0,0 +1,37 @@
package com.mathgenerator.service;
import com.mathgenerator.model.Level;
import com.mathgenerator.model.User;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
*
* <p>
*
* UserService使UserService
*
*/
public class DefaultUserInitializer {
/**
*
* <p>
*
*
* @return 9Map
*/
public static Map<String, User> createDefaultUsers() {
Map<String, User> users = new ConcurrentHashMap<>();
users.put("张三1", new User("张三1", "123", Level.PRIMARY));
users.put("张三2", new User("张三2", "123", Level.PRIMARY));
users.put("张三3", new User("张三3", "123", Level.PRIMARY));
users.put("李四1", new User("李四1", "123", Level.JUNIOR_HIGH));
users.put("李四2", new User("李四2", "123", Level.JUNIOR_HIGH));
users.put("李四3", new User("李四3", "123", Level.JUNIOR_HIGH));
users.put("王五1", new User("王五1", "123", Level.SENIOR_HIGH));
users.put("王五2", new User("王五2", "123", Level.SENIOR_HIGH));
users.put("王五3", new User("王五3", "123", Level.SENIOR_HIGH));
return users;
}
}

@ -61,7 +61,7 @@ public class PaperService {
try {
String filePath = fileManager.savePaper(user.username(), newPaper);
System.out.println("成功!" + count + "道数学题目已生成。");
System.out.println("成功!" + count + "道"+ currentLevel.getChineseName() + "数学题目已生成。");
System.out.println("文件已保存至: " + filePath);
} catch (IOException e) {
System.err.println("错误:保存文件失败 - " + e.getMessage());

@ -26,36 +26,58 @@ import java.util.concurrent.ConcurrentHashMap;
public class UserService {
//private static final Path USER_FILE_PATH = Paths.get("./src/main/java/com/mathgenerator/auth/users.json");
private static final Path USER_FILE_PATH = Paths.get("users.json");
private final Map<String, User> userDatabase;
private Map<String, User> userDatabase;
private final Gson gson = new GsonBuilder().setPrettyPrinting().create();
/**
* UserService
* users.json
* TODO
*/
public UserService() {
this.userDatabase = loadUsers();
if (Files.exists(USER_FILE_PATH)) {
this.userDatabase = loadUsersFromFile();
} else {
this.userDatabase = createAndSaveDefaultUsers();
}
}
/**
* users.json
*
* @return Map
*
* {@link #createAndSaveDefaultUsers}
* TODO
*/
private Map<String, User> loadUsers() {
if (!Files.exists(USER_FILE_PATH)) {
return new ConcurrentHashMap<>(); // 如果文件不存在返回一个空的Map
}
private Map<String, User> loadUsersFromFile() {
try (FileReader reader = new FileReader(USER_FILE_PATH.toFile())) {
Type type = new TypeToken<Map<String, User>>() {}.getType();
Map<String, User> loadedUsers = gson.fromJson(reader, type);
return new ConcurrentHashMap<>(loadedUsers); // 确保线程安全
return loadedUsers != null ? new ConcurrentHashMap<>(loadedUsers) : new ConcurrentHashMap<>();
} catch (IOException e) {
System.err.println("错误:加载用户文件失败 - " + e.getMessage());
return new ConcurrentHashMap<>();
}
}
/**
*
* json
*/
private Map<String, User> createAndSaveDefaultUsers() {
System.out.println("未找到用户文件,正在创建并初始化默认用户...");
// --- 核心改动:调用独立的初始化类来获取默认用户 ---
Map<String, User> defaultUsers = DefaultUserInitializer.createDefaultUsers();
try (FileWriter writer = new FileWriter(USER_FILE_PATH.toFile())) {
gson.toJson(defaultUsers, writer);
System.out.println("默认用户初始化完成。");
} catch (IOException e) {
System.err.println("错误:保存初始用户文件失败 - " + e.getMessage());
}
return defaultUsers;
}
/**
* users.json
*/

Loading…
Cancel
Save