diff --git a/doc/README.md b/doc/README.md new file mode 100644 index 0000000..4829c5d --- /dev/null +++ b/doc/README.md @@ -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 + + + + + diff --git a/src/Base/Email_settings.java b/src/Base/Email_settings.java index 43e8fb1..ea57b1f 100644 --- a/src/Base/Email_settings.java +++ b/src/Base/Email_settings.java @@ -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")); + } } diff --git a/src/Service/Generate_paper.java b/src/Generator/Generate_paper.java similarity index 87% rename from src/Service/Generate_paper.java rename to src/Generator/Generate_paper.java index 11188a8..ebf5c6d 100644 --- a/src/Service/Generate_paper.java +++ b/src/Generator/Generate_paper.java @@ -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; } diff --git a/src/Send_Email/Send_email.java b/src/Send_Email/Send_email.java index 5c63db7..809024f 100644 --- a/src/Send_Email/Send_email.java +++ b/src/Send_Email/Send_email.java @@ -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("注册验证码"); // 邮件内容 diff --git a/src/Service/Exam_service.java b/src/Service/Exam_service.java index 30b47da..dc84cf2 100644 --- a/src/Service/Exam_service.java +++ b/src/Service/Exam_service.java @@ -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<>();