Merge pull request '2025-10-09 16:27 乔毅凡合并' (#4) from qiaoyifan_branch into develop

develop
pnl4utw52 2 months ago
commit f4ba30bca1

@ -0,0 +1,58 @@
# 带UI的数学学习软件
## 项目结构
Math_learning
|——lib  依赖jar包
  |——javax.mail-1.6.2.jar  发送邮件相关
  |——activation-1.1.1.jar  javax.mail所需依赖
|——src  源代码目录
  |——Base  基础类包
    |——Email_settings.java  邮件发送服务配置
    |——Exam_result.java  考试结果类
    |——Question.java  题目类
    |——User.java  用户类
  |——Generator  题目生成器包
    |——G_ques.java  生成器接口
    |——Pri_g_ques.java  小学题目生成器
    |——Jun_g_ques.java  初中题目生成器
    |——Sen_g_ques.java  高中题目生成器
    |——Generate_paper.java  生成试卷
  |——Send_Email  邮件发送包
    |——Deal_i_code.java  管理验证码以及验证码校验
    |——Generate_i_code.java  产生验证码
    |——Send_email.java  发送邮件类
  |——Service  服务类包,供前端调用
    |——User_service.java  用户服务类,包括注册、登录、修改密码等
    |——Exam_service.java  考试服务类
    |——Deal_file.java  可选功能:保存试卷为文件
  |——View  前端类包
|——doc  说明文档
  |——README.md
## 邮件发送说明
发件人信息通过配置文件存储首次运行时会创建config/email.properties配置文件并使用默认配置乔毅凡的qq邮箱
修改配置文件可更改发件人配置,如果要使用自己的邮箱,需要去设置中开启特定配置。
以QQ邮箱为例子
1. 需要去自己的邮箱设置中找到POP3/IMAP/SMTP/Exchange/CardDAV 服务,选择开启,生成授权码。
2. 查看QQ邮箱配置方法中的说明看到“发送邮件服务器 smtp.qq.com使用SSL端口号465或587”这就是发件服务器和使用的端口以及使用SSL。
3. 将上述信息修改到配置文件中。发件服务器、端口、SSL在默认配置中已经为QQ邮箱的配置修改邮箱和授权码即可
4. 其他邮箱配置方法具体见官方说明。
## 用户信息
用户信息保存在本地,用户/用户信息.txt(运行时会产生)
## 运行环境
可执行文件Math_Learning.jar依赖已经打包
Windows  UTF-8编码  
---
软件2302
刘星宇 202326010226
毛承上 202326010227
乔毅凡 202326010228

@ -1,13 +1,86 @@
package Base;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;
public class Email_settings {
public static final String SMTP_HOST = "smtp.qq.com";
// 邮箱服务器端口
public static final String SMTP_PORT = "587";
// 发件人邮箱
public static final String FROM_EMAIL = "835981889@qq.com";
// 发件人邮箱授权码
public static final String EMAIL_PASSWORD = "fpqfprqznbvdbcdf";
// 是否启用SSL
public static final boolean SSL_ENABLE = true;
private static final String CONFIG_FILE = "config/email.properties";
private static Properties properties;
private static long lastModified = 0;
static {
loadConfig();
}
private static void loadConfig() {
properties = new Properties();
setDefaultProperties();
File configFile = new File(CONFIG_FILE);
if (configFile.exists()) {
try (FileInputStream input = new FileInputStream(configFile)) {
properties.load(input);
lastModified = configFile.lastModified();
} catch (IOException e) {
System.err.println("加载邮箱配置文件失败,使用默认配置: " + e.getMessage());
}
} else {
createDefaultConfigFile();
}
}
private static void setDefaultProperties() {
properties.setProperty("smtp.host", "smtp.qq.com");
properties.setProperty("smtp.port", "587");
properties.setProperty("from.email", "835981889@qq.com");
properties.setProperty("email.password", "fpqfprqznbvdbcdf");
properties.setProperty("ssl.enable", "true");
}
private static void createDefaultConfigFile() {
File configDir = new File("config");
if (!configDir.exists()) {
configDir.mkdirs();
}
try (FileOutputStream output = new FileOutputStream(CONFIG_FILE)) {
properties.store(output, "Settings");
} catch (IOException e) {
System.err.println("创建默认配置文件失败: " + e.getMessage());
}
}
private static void checkForUpdates() {
File configFile = new File(CONFIG_FILE);
if (configFile.exists() && configFile.lastModified() > lastModified) {
loadConfig();
}
}
public static String getSmtpHost() {
checkForUpdates();
return properties.getProperty("smtp.host");
}
public static String getSmtpPort() {
checkForUpdates();
return properties.getProperty("smtp.port");
}
public static String getFromEmail() {
checkForUpdates();
return properties.getProperty("from.email");
}
public static String getEmailPassword() {
checkForUpdates();
return properties.getProperty("email.password");
}
public static boolean isSslEnable() {
checkForUpdates();
return Boolean.parseBoolean(properties.getProperty("ssl.enable"));
}
}

@ -1,10 +1,7 @@
package Service;
package Generator;
import Base.Question;
import Generator.G_ques;
import Generator.Jun_g_ques;
import Generator.Pri_g_ques;
import Generator.Sen_g_ques;
import Service.Deal_file;
import java.util.ArrayList;
@ -40,8 +37,8 @@ public class Generate_paper {
t.set_options();
result.add(t);
}
Deal_file d=new Deal_file();
d.savePaper(result,id);
/*Deal_file d=new Deal_file();
d.savePaper(result,id);*/
return result;
}

@ -59,23 +59,23 @@ public class Send_email {
public static boolean send_email(String toEmail, String Code) {
try {
Properties props = new Properties();
props.put("mail.smtp.host", Email_settings.SMTP_HOST);
props.put("mail.smtp.port", Email_settings.SMTP_PORT);
props.put("mail.smtp.host", Email_settings.getSmtpHost());
props.put("mail.smtp.port", Email_settings.getSmtpPort());
props.put("mail.smtp.auth", "true");
if (Email_settings.SSL_ENABLE) {
if (Email_settings.isSslEnable()) {
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.ssl.trust", Email_settings.SMTP_HOST);
props.put("mail.smtp.ssl.trust", Email_settings.getSmtpHost());
}
// 创建会话
Session session = Session.getInstance(props, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(Email_settings.FROM_EMAIL, Email_settings.EMAIL_PASSWORD);
return new PasswordAuthentication(Email_settings.getFromEmail(), Email_settings.getEmailPassword());
}
});
// 创建邮件消息
Message message = new MimeMessage(session);
message.setFrom(new InternetAddress(Email_settings.FROM_EMAIL));
message.setFrom(new InternetAddress(Email_settings.getFromEmail()));
message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(toEmail));
message.setSubject("注册验证码");
// 邮件内容

@ -2,6 +2,7 @@ package Service;
import Base.Exam_result;
import Base.Question;
import Generator.Generate_paper;
import java.util.*;
@ -17,7 +18,7 @@ public class Exam_service {
public Exam_service(int num,String type,String id){
this.id=id;
this.type=type;
paper=Generate_paper.g_paper(num,type,id);
paper= Generate_paper.g_paper(num,type,id);
now_index=0;
this.start_time = new Date();
this.user_answers = new HashMap<>();

Loading…
Cancel
Save