2023年3月9日18:09:41

master
zhangmeng 2023-03-09 18:09:52 +08:00
parent 71aece0cbf
commit 708c7c4c82
8 changed files with 273 additions and 1 deletions

View File

@ -434,4 +434,9 @@ public class HomeController implements Serializable {
ListView<ResourcesUtils.Player> listView = (ListView) fx.lookup("#listView"); ListView<ResourcesUtils.Player> listView = (ListView) fx.lookup("#listView");
listView.getSelectionModel().select(index); listView.getSelectionModel().select(index);
} }
@FXML
public void mail_menu_item(ActionEvent event) {
load_small_tools(7);
}
} }

View File

@ -0,0 +1,189 @@
package com.zhangmeng.tools.controller;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.resource.Resource;
import cn.hutool.core.io.resource.ResourceUtil;
import cn.hutool.extra.mail.MailUtil;
import cn.hutool.setting.Setting;
import com.zhangmeng.tools.utils.AlertUtils;
import com.zhangmeng.tools.utils.ImagePath;
import javafx.beans.property.SimpleObjectProperty;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.scene.control.*;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.stage.FileChooser;
import javafx.stage.Stage;
import lombok.extern.slf4j.Slf4j;
import java.io.File;
/**
* @author :
* @version : 1.0
* @date : 2023-03-09 16:24
*/
@Slf4j
public class MailController {
@FXML
public TextField host;
@FXML
public TextField port;
@FXML
public TextField from;
@FXML
public TextField user;
@FXML
public TextField pass;
@FXML
public TextArea content;
@FXML
public Button send;
@FXML
public ListView<String> user_list;
@FXML
public TextField to;
@FXML
public Button add_user_to;
@FXML
public TextField file_path;
@FXML
public Button choose_file;
public static int mail_port = 25;
public ObservableList<String> list = FXCollections.observableArrayList();
public static final String p = "smtp";
private final Setting setting = new Setting("config/mail.setting");
private SimpleObjectProperty<File> file_info = new SimpleObjectProperty<>();
@FXML
public void initialize() {
choose_file.setText(null);
ImageView iv = new ImageView(new Image(ImagePath.path(ImagePath.ImagePathType.IMAGE_FILE)));
iv.setPreserveRatio(true);
iv.setFitWidth(18);
choose_file.setGraphic(iv);
choose_file.setOnAction(event -> {
Stage stage = new Stage();
FileChooser fc = new FileChooser();
fc.setTitle("单选文件");
fc.getExtensionFilters().addAll(
new FileChooser.ExtensionFilter("所有类型", "*.*")
);
File file = fc.showOpenDialog(stage);
if (file == null) {
return;
}
file_info.setValue(file);
});
setting.autoLoad(true);
String main_host = setting.get("host");
String main_port = setting.get("port");
String main_from = setting.get("from");
String main_user = setting.get("user");
String main_pass = setting.get("pass");
if (main_host != null && main_host.length() != 0){
host.setText(main_host);
}
if (main_port != null && main_port.length() != 0){
port.setText(main_port);
}
if (main_from != null && main_from.length() != 0){
from.setText(main_from);
}
if (main_user != null && main_user.length() != 0){
user.setText(main_user);
}
if (main_pass != null && main_pass.length() != 0){
pass.setText(main_pass);
}
//设置端口默认
if (port.getText().length() == 0){
port.setText(String.valueOf(MailController.mail_port));
}
user_list.setFixedCellSize(40);
user_list.setItems(list);
user_list.setPlaceholder(new Label("暂无发送人!"));
from.textProperty().addListener((observable, oldValue, newValue) -> {
if (newValue != null){
host.setText(p + "." + newValue.split("@")[1]);
user.setText(newValue.split("@")[0]);
}
});
send.setOnAction(event -> {
if (from.getText().length() == 0 ){
AlertUtils.alert_warning("发件人不能为空!");
return;
}
if (pass.getText().length() == 0 ){
AlertUtils.alert_warning("发件人密码不能为空!");
return;
}
if (host.getText().length() == 0 ){
host.setText(p + "." + from.getText().split("@")[1]);
}
if (port.getText().length() == 0){
user.setText(from.getText().split("@")[0]);
}
save_config();
//判断附件是否为空
});
choose_file.setOnAction(event -> {
});
}
private void save_config(){
save("host",host.getText());
save("port",port.getText());
}
private void save(String key,String value){
setting.set(key,value);
String settingPath = setting.getSettingPath();
setting.store(settingPath);
}
}

View File

@ -32,6 +32,7 @@ import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue; import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections; import javafx.collections.FXCollections;
import javafx.collections.ObservableList; import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.fxml.FXML; import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader; import javafx.fxml.FXMLLoader;
import javafx.geometry.Pos; import javafx.geometry.Pos;
@ -72,6 +73,7 @@ public class SmallToolsController {
private AnchorPane qr_code; private AnchorPane qr_code;
private AnchorPane date_query; private AnchorPane date_query;
private AnchorPane cron; private AnchorPane cron;
private AnchorPane mail;
@FXML @FXML
private ListView<ResourcesUtils.SmallTools> listView; private ListView<ResourcesUtils.SmallTools> listView;
@ -335,6 +337,13 @@ public class SmallToolsController {
} }
cron(flag); cron(flag);
} }
if (newValue.getIndex() == 7) {
if (mail != null) {
flag = true;
}
mail(flag);
}
} }
}); });
} }
@ -348,6 +357,7 @@ public class SmallToolsController {
case Qr_CODE -> new Image(ImagePath.path(ImagePath.ImagePathType.Qr_CODE)); case Qr_CODE -> new Image(ImagePath.path(ImagePath.ImagePathType.Qr_CODE));
case Date_Query -> new Image(ImagePath.path(ImagePath.ImagePathType.Qr_CODE)); case Date_Query -> new Image(ImagePath.path(ImagePath.ImagePathType.Qr_CODE));
case Cron -> new Image(ImagePath.path(ImagePath.ImagePathType.Qr_CODE)); case Cron -> new Image(ImagePath.path(ImagePath.ImagePathType.Qr_CODE));
case Mail -> new Image(ImagePath.path(ImagePath.ImagePathType.Qr_CODE));
}; };
} }
@ -559,4 +569,30 @@ public class SmallToolsController {
log.info("newValue.doubleValue():{}", newValue.doubleValue()); log.info("newValue.doubleValue():{}", newValue.doubleValue());
}); });
} }
@FXML
public void mail_menu_item(ActionEvent event) {
boolean flag = false;
if (mail != null){
flag = true;
}
mail(flag);
}
private void mail(boolean flag ){
//默认选择第一个
listView.getSelectionModel().select(7);
if (!flag) {
try {
root = FXMLLoader.load(ResourcesUtils.getResource("mail"));
} catch (IOException e) {
e.printStackTrace();
}
mail = root;
} else {
root = mail;
}
common_method();
}
} }

View File

@ -110,7 +110,6 @@ public class ResourcesUtils {
} }
public enum SmallTools{ public enum SmallTools{
Hex_16("16进制Hex",0), Hex_16("16进制Hex",0),
Unicode("Unicode和字符串转换",1), Unicode("Unicode和字符串转换",1),
JWT_WEB("json-web-token",2), JWT_WEB("json-web-token",2),
@ -118,6 +117,7 @@ public class ResourcesUtils {
Qr_CODE("生成二维码",4), Qr_CODE("生成二维码",4),
Date_Query("日历",5), Date_Query("日历",5),
Cron("cron表达式",6), Cron("cron表达式",6),
Mail("发送邮件",7),
; ;
SmallTools(String title, int index) { SmallTools(String title, int index) {

View File

View File

@ -37,6 +37,7 @@
<MenuItem mnemonicParsing="false" text="二维码生成" onAction="#qr_code_menu_item"/> <MenuItem mnemonicParsing="false" text="二维码生成" onAction="#qr_code_menu_item"/>
<MenuItem mnemonicParsing="false" text="时间工具" onAction="#date_query_menu_item"/> <MenuItem mnemonicParsing="false" text="时间工具" onAction="#date_query_menu_item"/>
<MenuItem mnemonicParsing="false" text="cron表达式" onAction="#cron_menu_item"/> <MenuItem mnemonicParsing="false" text="cron表达式" onAction="#cron_menu_item"/>
<MenuItem mnemonicParsing="false" text="邮件发送" onAction="#mail_menu_item"/>
</items> </items>
</Menu> </Menu>

View File

@ -0,0 +1,40 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.ListView?>
<?import javafx.scene.control.TextArea?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.text.Text?>
<AnchorPane fx:controller="com.zhangmeng.tools.controller.MailController" prefHeight="649.0" prefWidth="1200.0" xmlns="http://javafx.com/javafx/19" xmlns:fx="http://javafx.com/fxml/1">
<children>
<Label layoutX="33.0" layoutY="46.0" text="邮件服务器的SMTP地址:" />
<TextField fx:id="host" layoutX="171.0" layoutY="42.0" prefHeight="25.0" prefWidth="285.0" />
<Label layoutX="33.0" layoutY="106.0" text="邮件服务器的SMTP端口:" />
<TextField fx:id="port" layoutX="171.0" layoutY="102.0" prefHeight="25.0" prefWidth="285.0" />
<TextField fx:id="from" layoutX="171.0" layoutY="159.0" prefHeight="25.0" prefWidth="285.0" />
<TextField fx:id="user" layoutX="171.0" layoutY="211.0" prefHeight="25.0" prefWidth="285.0" />
<Label layoutX="126.0" layoutY="163.0" text="发件人:" />
<Label layoutX="126.0" layoutY="215.0" text="用户名:" />
<Label layoutX="138.0" layoutY="264.0" text="密码:" />
<TextField fx:id="pass" layoutX="171.0" layoutY="260.0" prefHeight="25.0" prefWidth="285.0" />
<Text layoutX="471.0" layoutY="59.0" strokeType="OUTSIDE" strokeWidth="0.0" text="(可选默认为smtp.&lt;发件人邮箱后缀&gt;)" />
<Text layoutX="471.0" layoutY="119.0" strokeType="OUTSIDE" strokeWidth="0.0" text="(可选默认25)" />
<Text layoutX="471.0" layoutY="176.0" strokeType="OUTSIDE" strokeWidth="0.0" text="(必须正确,否则发送失败)" />
<Text layoutX="471.0" layoutY="277.0" strokeType="OUTSIDE" strokeWidth="0.0" text="(注意某些邮箱需要为SMTP服务单独设置授权码)" />
<Text layoutX="471.0" layoutY="228.0" strokeType="OUTSIDE" strokeWidth="0.0" text="(默认为发件人邮箱前缀)" />
<Label layoutX="138.0" layoutY="319.0" text="内容:" />
<TextArea fx:id="content" layoutX="171.0" layoutY="328.0" prefHeight="178.0" prefWidth="940.0" AnchorPane.bottomAnchor="151.0" AnchorPane.leftAnchor="171.0" AnchorPane.rightAnchor="89.0" AnchorPane.topAnchor="320.0" />
<Button fx:id="send" layoutX="276.0" layoutY="565.0" mnemonicParsing="false" text="发送" AnchorPane.bottomAnchor="59.0" />
<Label layoutX="752.0" layoutY="46.0" text="发送人列表:" />
<ListView fx:id="user_list" layoutX="826.0" layoutY="40.0" prefHeight="149.0" prefWidth="285.0" AnchorPane.leftAnchor="826.0" AnchorPane.rightAnchor="89.0" AnchorPane.topAnchor="40.0" />
<Label layoutX="752.0" layoutY="215.0" text="发送人邮箱:" />
<TextField fx:id="to" layoutX="826.0" layoutY="211.0" prefHeight="25.0" prefWidth="285.0" AnchorPane.leftAnchor="826.0" AnchorPane.rightAnchor="89.0" />
<Button fx:id="add_user_to" layoutX="941.0" layoutY="260.0" mnemonicParsing="false" text="添加" />
<Label layoutX="130.0" layoutY="513.0" text="附件:" AnchorPane.bottomAnchor="119.0" />
<TextField fx:id="file_path" layoutX="233.0" layoutY="509.0" prefHeight="25.0" prefWidth="330.0" AnchorPane.bottomAnchor="115.0" AnchorPane.leftAnchor="233.0" AnchorPane.rightAnchor="637.0" />
<Button fx:id="choose_file" layoutX="171.0" layoutY="509.0" mnemonicParsing="false" text="Button" AnchorPane.bottomAnchor="115.0" />
</children>
</AnchorPane>

View File

@ -36,6 +36,7 @@
<MenuItem mnemonicParsing="false" text="二维码生成" onAction="#qr_code_menu_item"/> <MenuItem mnemonicParsing="false" text="二维码生成" onAction="#qr_code_menu_item"/>
<MenuItem mnemonicParsing="false" text="时间工具" onAction="#date_query_menu_item"/> <MenuItem mnemonicParsing="false" text="时间工具" onAction="#date_query_menu_item"/>
<MenuItem mnemonicParsing="false" text="cron表达式" onAction="#cron_menu_item"/> <MenuItem mnemonicParsing="false" text="cron表达式" onAction="#cron_menu_item"/>
<MenuItem mnemonicParsing="false" text="邮件发送" onAction="#mail_menu_item"/>
</items> </items>
</Menu> </Menu>