From 17b61a7cb27bf20dfde5081f3bef43502e218d7d Mon Sep 17 00:00:00 2001 From: sunsence Date: Sun, 15 Sep 2019 18:41:02 +0800 Subject: [PATCH 01/16] =?UTF-8?q?feature:=E5=A2=9E=E5=8A=A0=E5=AF=B9?= =?UTF-8?q?=E5=8F=88=E6=8B=8D=E4=BA=91=E7=9F=AD=E4=BF=A1=E7=9A=84=E6=94=AF?= =?UTF-8?q?=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tool/push/ui/form/SettingForm.form | 65 ++++- .../tool/push/ui/form/SettingForm.java | 235 ++++++++++-------- .../push/ui/listener/SettingListener.java | 34 +-- .../fangxuele/tool/push/util/ConfigUtil.java | 10 + 4 files changed, 218 insertions(+), 126 deletions(-) diff --git a/src/main/java/com/fangxuele/tool/push/ui/form/SettingForm.form b/src/main/java/com/fangxuele/tool/push/ui/form/SettingForm.form index 41d6e6a9..293ed61a 100644 --- a/src/main/java/com/fangxuele/tool/push/ui/form/SettingForm.form +++ b/src/main/java/com/fangxuele/tool/push/ui/form/SettingForm.form @@ -36,7 +36,7 @@ - + @@ -1144,12 +1144,65 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1202,7 +1255,7 @@ - + @@ -1344,7 +1397,7 @@ - + @@ -1438,7 +1491,7 @@ - + @@ -1557,7 +1610,7 @@ - + diff --git a/src/main/java/com/fangxuele/tool/push/ui/form/SettingForm.java b/src/main/java/com/fangxuele/tool/push/ui/form/SettingForm.java index fc5ba7b1..1e5f2832 100644 --- a/src/main/java/com/fangxuele/tool/push/ui/form/SettingForm.java +++ b/src/main/java/com/fangxuele/tool/push/ui/form/SettingForm.java @@ -115,6 +115,8 @@ public class SettingForm { private JTextField bdAccessKeyIdTextField; private JTextField bdEndPointTextField; private JTextField bdInvokeIdTextField; + private JTextField upAuthorizationTokenTextField; + private JButton upSaveButton; private static SettingForm settingForm; private static TWxAccountMapper wxAccountMapper = MybatisUtil.getSqlSession().getMapper(TWxAccountMapper.class); @@ -213,6 +215,9 @@ public static void init() { settingForm.getBdEndPointTextField().setText(App.config.getBdEndPoint()); settingForm.getBdInvokeIdTextField().setText(App.config.getBdInvokeId()); + // 又拍云短信 + settingForm.getUpAuthorizationTokenTextField().setText(App.config.getUpAuthorizationToken()); + // 云片网短信 settingForm.getYunpianApiKeyTextField().setText(App.config.getYunpianApiKey()); @@ -373,7 +378,7 @@ public static void toggleMpOutSideAccessTokenPanel() { final Spacer spacer1 = new Spacer(); panel2.add(spacer1, new GridConstraints(1, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_VERTICAL, 1, GridConstraints.SIZEPOLICY_WANT_GROW, null, null, null, 0, false)); final JPanel panel3 = new JPanel(); - panel3.setLayout(new GridLayoutManager(14, 1, new Insets(40, 60, 0, 330), -1, -1)); + panel3.setLayout(new GridLayoutManager(15, 1, new Insets(40, 60, 0, 330), -1, -1)); panel2.add(panel3, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, new Dimension(600, -1), null, 0, false)); final JPanel panel4 = new JPanel(); panel4.setLayout(new GridLayoutManager(1, 1, new Insets(15, 15, 10, 0), -1, -1)); @@ -753,120 +758,138 @@ public static void toggleMpOutSideAccessTokenPanel() { final JPanel panel24 = new JPanel(); panel24.setLayout(new GridLayoutManager(2, 4, new Insets(15, 15, 10, 0), -1, -1)); panel3.add(panel24, new GridConstraints(9, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, null, null, 0, false)); - panel24.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEmptyBorder(), "云片网短信", TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION, this.$$$getFont$$$(null, Font.BOLD, -1, panel24.getFont()))); + panel24.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEmptyBorder(), "又拍云短信", TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION, this.$$$getFont$$$(null, Font.BOLD, -1, panel24.getFont()))); final JLabel label38 = new JLabel(); - label38.setText("ApiKey"); + label38.setText("授权token"); panel24.add(label38, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); - yunpianApiKeyTextField = new JPasswordField(); - yunpianApiKeyTextField.setText(""); - panel24.add(yunpianApiKeyTextField, new GridConstraints(0, 1, 1, 3, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, new Dimension(300, -1), new Dimension(300, -1), null, 0, false)); final JPanel panel25 = new JPanel(); panel25.setLayout(new GridLayoutManager(1, 2, new Insets(0, 0, 0, 0), -1, -1)); panel24.add(panel25, new GridConstraints(1, 0, 1, 4, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, null, null, 0, false)); - settingYunpianSaveButton = new JButton(); - settingYunpianSaveButton.setIcon(new ImageIcon(getClass().getResource("/icon/menu-saveall_dark.png"))); - settingYunpianSaveButton.setText("保存"); - panel25.add(settingYunpianSaveButton, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + upSaveButton = new JButton(); + upSaveButton.setIcon(new ImageIcon(getClass().getResource("/icon/menu-saveall_dark.png"))); + upSaveButton.setText("保存"); + panel25.add(upSaveButton, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); final Spacer spacer13 = new Spacer(); panel25.add(spacer13, new GridConstraints(0, 1, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, 1, null, null, null, 0, false)); + upAuthorizationTokenTextField = new JTextField(); + panel24.add(upAuthorizationTokenTextField, new GridConstraints(0, 1, 1, 3, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, new Dimension(300, -1), new Dimension(300, -1), null, 0, false)); final JPanel panel26 = new JPanel(); - panel26.setLayout(new GridLayoutManager(8, 4, new Insets(15, 15, 10, 0), -1, -1)); - panel3.add(panel26, new GridConstraints(11, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, null, null, 0, false)); - panel26.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEmptyBorder(), "E-Mail", TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION, this.$$$getFont$$$(null, Font.BOLD, -1, panel26.getFont()))); + panel26.setLayout(new GridLayoutManager(2, 4, new Insets(15, 15, 10, 0), -1, -1)); + panel3.add(panel26, new GridConstraints(10, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, null, null, 0, false)); + panel26.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEmptyBorder(), "云片网短信", TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION, this.$$$getFont$$$(null, Font.BOLD, -1, panel26.getFont()))); final JLabel label39 = new JLabel(); - label39.setText("邮件服务器的SMTP地址"); + label39.setText("ApiKey"); panel26.add(label39, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + yunpianApiKeyTextField = new JPasswordField(); + yunpianApiKeyTextField.setText(""); + panel26.add(yunpianApiKeyTextField, new GridConstraints(0, 1, 1, 3, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, new Dimension(300, -1), new Dimension(300, -1), null, 0, false)); + final JPanel panel27 = new JPanel(); + panel27.setLayout(new GridLayoutManager(1, 2, new Insets(0, 0, 0, 0), -1, -1)); + panel26.add(panel27, new GridConstraints(1, 0, 1, 4, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, null, null, 0, false)); + settingYunpianSaveButton = new JButton(); + settingYunpianSaveButton.setIcon(new ImageIcon(getClass().getResource("/icon/menu-saveall_dark.png"))); + settingYunpianSaveButton.setText("保存"); + panel27.add(settingYunpianSaveButton, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + final Spacer spacer14 = new Spacer(); + panel27.add(spacer14, new GridConstraints(0, 1, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, 1, null, null, null, 0, false)); + final JPanel panel28 = new JPanel(); + panel28.setLayout(new GridLayoutManager(8, 4, new Insets(15, 15, 10, 0), -1, -1)); + panel3.add(panel28, new GridConstraints(12, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, null, null, 0, false)); + panel28.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEmptyBorder(), "E-Mail", TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION, this.$$$getFont$$$(null, Font.BOLD, -1, panel28.getFont()))); final JLabel label40 = new JLabel(); - label40.setText("邮件服务器的SMTP端口"); - panel26.add(label40, new GridConstraints(1, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + label40.setText("邮件服务器的SMTP地址"); + panel28.add(label40, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); final JLabel label41 = new JLabel(); - label41.setText("发件人(邮箱地址)"); - panel26.add(label41, new GridConstraints(2, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + label41.setText("邮件服务器的SMTP端口"); + panel28.add(label41, new GridConstraints(1, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); final JLabel label42 = new JLabel(); - label42.setText("用户名"); - label42.setToolTipText("如果使用foxmail邮箱,此处为qq号"); - panel26.add(label42, new GridConstraints(3, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + label42.setText("发件人(邮箱地址)"); + panel28.add(label42, new GridConstraints(2, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); final JLabel label43 = new JLabel(); - label43.setText("密码"); - panel26.add(label43, new GridConstraints(4, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); - final JPanel panel27 = new JPanel(); - panel27.setLayout(new GridLayoutManager(1, 3, new Insets(0, 0, 0, 0), -1, -1)); - panel26.add(panel27, new GridConstraints(7, 0, 1, 4, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, null, null, 0, false)); + label43.setText("用户名"); + label43.setToolTipText("如果使用foxmail邮箱,此处为qq号"); + panel28.add(label43, new GridConstraints(3, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + final JLabel label44 = new JLabel(); + label44.setText("密码"); + panel28.add(label44, new GridConstraints(4, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + final JPanel panel29 = new JPanel(); + panel29.setLayout(new GridLayoutManager(1, 3, new Insets(0, 0, 0, 0), -1, -1)); + panel28.add(panel29, new GridConstraints(7, 0, 1, 4, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, null, null, 0, false)); saveMailButton = new JButton(); saveMailButton.setIcon(new ImageIcon(getClass().getResource("/icon/menu-saveall_dark.png"))); saveMailButton.setText("保存"); - panel27.add(saveMailButton, new GridConstraints(0, 1, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); - final Spacer spacer14 = new Spacer(); - panel27.add(spacer14, new GridConstraints(0, 2, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, 1, null, null, null, 0, false)); + panel29.add(saveMailButton, new GridConstraints(0, 1, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + final Spacer spacer15 = new Spacer(); + panel29.add(spacer15, new GridConstraints(0, 2, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, 1, null, null, null, 0, false)); testMailButton = new JButton(); testMailButton.setIcon(new ImageIcon(getClass().getResource("/icon/arrow_right.png"))); testMailButton.setText("测试"); - panel27.add(testMailButton, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + panel29.add(testMailButton, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); mailStartTLSCheckBox = new JCheckBox(); mailStartTLSCheckBox.setText("使用STARTTLS安全连接"); - panel26.add(mailStartTLSCheckBox, new GridConstraints(5, 0, 1, 4, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + panel28.add(mailStartTLSCheckBox, new GridConstraints(5, 0, 1, 4, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); mailSSLCheckBox = new JCheckBox(); mailSSLCheckBox.setText("使用SSL安全连接"); - panel26.add(mailSSLCheckBox, new GridConstraints(6, 0, 1, 4, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + panel28.add(mailSSLCheckBox, new GridConstraints(6, 0, 1, 4, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); mailHostTextField = new JTextField(); - panel26.add(mailHostTextField, new GridConstraints(0, 1, 1, 3, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_FIXED, null, new Dimension(150, -1), null, 0, false)); + panel28.add(mailHostTextField, new GridConstraints(0, 1, 1, 3, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_FIXED, null, new Dimension(150, -1), null, 0, false)); mailPortTextField = new JTextField(); - panel26.add(mailPortTextField, new GridConstraints(1, 1, 1, 3, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_FIXED, null, new Dimension(150, -1), null, 0, false)); + panel28.add(mailPortTextField, new GridConstraints(1, 1, 1, 3, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_FIXED, null, new Dimension(150, -1), null, 0, false)); mailFromTextField = new JTextField(); - panel26.add(mailFromTextField, new GridConstraints(2, 1, 1, 3, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_FIXED, null, new Dimension(150, -1), null, 0, false)); + panel28.add(mailFromTextField, new GridConstraints(2, 1, 1, 3, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_FIXED, null, new Dimension(150, -1), null, 0, false)); mailUserTextField = new JTextField(); - panel26.add(mailUserTextField, new GridConstraints(3, 1, 1, 3, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_FIXED, null, new Dimension(150, -1), null, 0, false)); + panel28.add(mailUserTextField, new GridConstraints(3, 1, 1, 3, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_FIXED, null, new Dimension(150, -1), null, 0, false)); mailPasswordField = new JPasswordField(); - panel26.add(mailPasswordField, new GridConstraints(4, 1, 1, 3, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_FIXED, null, new Dimension(150, -1), null, 0, false)); - final JPanel panel28 = new JPanel(); - panel28.setLayout(new GridLayoutManager(4, 4, new Insets(15, 15, 10, 0), -1, -1)); - panel3.add(panel28, new GridConstraints(12, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, null, null, 0, false)); - panel28.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEmptyBorder(), "MySQL数据库", TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION, this.$$$getFont$$$(null, Font.BOLD, -1, panel28.getFont()))); - final JLabel label44 = new JLabel(); - label44.setText("数据库地址"); - panel28.add(label44, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); - mysqlUrlTextField = new JTextField(); - panel28.add(mysqlUrlTextField, new GridConstraints(0, 1, 1, 3, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, new Dimension(300, -1), new Dimension(300, -1), null, 0, false)); + panel28.add(mailPasswordField, new GridConstraints(4, 1, 1, 3, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_FIXED, null, new Dimension(150, -1), null, 0, false)); + final JPanel panel30 = new JPanel(); + panel30.setLayout(new GridLayoutManager(4, 4, new Insets(15, 15, 10, 0), -1, -1)); + panel3.add(panel30, new GridConstraints(13, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, null, null, 0, false)); + panel30.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEmptyBorder(), "MySQL数据库", TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION, this.$$$getFont$$$(null, Font.BOLD, -1, panel30.getFont()))); final JLabel label45 = new JLabel(); - label45.setText("用户名"); - panel28.add(label45, new GridConstraints(1, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); - mysqlUserTextField = new JTextField(); - panel28.add(mysqlUserTextField, new GridConstraints(1, 1, 1, 3, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, new Dimension(150, -1), null, 0, false)); + label45.setText("数据库地址"); + panel30.add(label45, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + mysqlUrlTextField = new JTextField(); + panel30.add(mysqlUrlTextField, new GridConstraints(0, 1, 1, 3, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, new Dimension(300, -1), new Dimension(300, -1), null, 0, false)); final JLabel label46 = new JLabel(); - label46.setText("密码"); - panel28.add(label46, new GridConstraints(2, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + label46.setText("用户名"); + panel30.add(label46, new GridConstraints(1, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + mysqlUserTextField = new JTextField(); + panel30.add(mysqlUserTextField, new GridConstraints(1, 1, 1, 3, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, new Dimension(150, -1), null, 0, false)); + final JLabel label47 = new JLabel(); + label47.setText("密码"); + panel30.add(label47, new GridConstraints(2, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); mysqlPasswordField = new JPasswordField(); - panel28.add(mysqlPasswordField, new GridConstraints(2, 1, 1, 3, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, new Dimension(150, -1), null, 0, false)); - final JPanel panel29 = new JPanel(); - panel29.setLayout(new GridLayoutManager(2, 3, new Insets(0, 0, 0, 0), -1, -1)); - panel28.add(panel29, new GridConstraints(3, 0, 1, 4, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, null, null, 0, false)); + panel30.add(mysqlPasswordField, new GridConstraints(2, 1, 1, 3, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, new Dimension(150, -1), null, 0, false)); + final JPanel panel31 = new JPanel(); + panel31.setLayout(new GridLayoutManager(2, 3, new Insets(0, 0, 0, 0), -1, -1)); + panel30.add(panel31, new GridConstraints(3, 0, 1, 4, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, null, null, 0, false)); settingTestDbLinkButton = new JButton(); settingTestDbLinkButton.setIcon(new ImageIcon(getClass().getResource("/icon/arrow_right.png"))); settingTestDbLinkButton.setText("测试连接"); - panel29.add(settingTestDbLinkButton, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); - final Spacer spacer15 = new Spacer(); - panel29.add(spacer15, new GridConstraints(0, 2, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, 1, null, null, null, 0, false)); + panel31.add(settingTestDbLinkButton, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + final Spacer spacer16 = new Spacer(); + panel31.add(spacer16, new GridConstraints(0, 2, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, 1, null, null, null, 0, false)); settingDbInfoSaveButton = new JButton(); settingDbInfoSaveButton.setIcon(new ImageIcon(getClass().getResource("/icon/menu-saveall_dark.png"))); settingDbInfoSaveButton.setText("保存"); - panel29.add(settingDbInfoSaveButton, new GridConstraints(0, 1, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); - final JPanel panel30 = new JPanel(); - panel30.setLayout(new GridLayoutManager(4, 3, new Insets(15, 15, 10, 0), -1, -1)); - panel3.add(panel30, new GridConstraints(13, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, null, null, 0, false)); - panel30.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEmptyBorder(), "外观", TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION, this.$$$getFont$$$(null, Font.BOLD, -1, panel30.getFont()))); - final JLabel label47 = new JLabel(); - label47.setText("主题风格"); - panel30.add(label47, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + panel31.add(settingDbInfoSaveButton, new GridConstraints(0, 1, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + final JPanel panel32 = new JPanel(); + panel32.setLayout(new GridLayoutManager(4, 3, new Insets(15, 15, 10, 0), -1, -1)); + panel3.add(panel32, new GridConstraints(14, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, null, null, 0, false)); + panel32.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEmptyBorder(), "外观", TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION, this.$$$getFont$$$(null, Font.BOLD, -1, panel32.getFont()))); + final JLabel label48 = new JLabel(); + label48.setText("主题风格"); + panel32.add(label48, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); settingThemeComboBox = new JComboBox(); final DefaultComboBoxModel defaultComboBoxModel1 = new DefaultComboBoxModel(); defaultComboBoxModel1.addElement("Darcula(推荐)"); defaultComboBoxModel1.addElement("BeautyEye"); defaultComboBoxModel1.addElement("系统默认"); settingThemeComboBox.setModel(defaultComboBoxModel1); - panel30.add(settingThemeComboBox, new GridConstraints(0, 1, 1, 2, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, new Dimension(300, -1), new Dimension(300, -1), null, 0, false)); - final JLabel label48 = new JLabel(); - label48.setText("字体"); - panel30.add(label48, new GridConstraints(1, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + panel32.add(settingThemeComboBox, new GridConstraints(0, 1, 1, 2, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, new Dimension(300, -1), new Dimension(300, -1), null, 0, false)); + final JLabel label49 = new JLabel(); + label49.setText("字体"); + panel32.add(label49, new GridConstraints(1, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); settingFontNameComboBox = new JComboBox(); final DefaultComboBoxModel defaultComboBoxModel2 = new DefaultComboBoxModel(); defaultComboBoxModel2.addElement("Microsoft YaHei"); @@ -874,10 +897,10 @@ public static void toggleMpOutSideAccessTokenPanel() { defaultComboBoxModel2.addElement("Microsoft YaHei UI"); defaultComboBoxModel2.addElement("Microsoft YaHei UI Light"); settingFontNameComboBox.setModel(defaultComboBoxModel2); - panel30.add(settingFontNameComboBox, new GridConstraints(1, 1, 1, 2, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); - final JLabel label49 = new JLabel(); - label49.setText("字号"); - panel30.add(label49, new GridConstraints(2, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + panel32.add(settingFontNameComboBox, new GridConstraints(1, 1, 1, 2, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + final JLabel label50 = new JLabel(); + label50.setText("字号"); + panel32.add(label50, new GridConstraints(2, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); settingFontSizeComboBox = new JComboBox(); final DefaultComboBoxModel defaultComboBoxModel3 = new DefaultComboBoxModel(); defaultComboBoxModel3.addElement("5"); @@ -903,51 +926,51 @@ public static void toggleMpOutSideAccessTokenPanel() { defaultComboBoxModel3.addElement("25"); defaultComboBoxModel3.addElement("26"); settingFontSizeComboBox.setModel(defaultComboBoxModel3); - panel30.add(settingFontSizeComboBox, new GridConstraints(2, 1, 1, 2, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); - final JPanel panel31 = new JPanel(); - panel31.setLayout(new GridLayoutManager(1, 2, new Insets(0, 0, 0, 0), -1, -1)); - panel30.add(panel31, new GridConstraints(3, 0, 1, 3, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, null, null, 0, false)); + panel32.add(settingFontSizeComboBox, new GridConstraints(2, 1, 1, 2, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + final JPanel panel33 = new JPanel(); + panel33.setLayout(new GridLayoutManager(1, 2, new Insets(0, 0, 0, 0), -1, -1)); + panel32.add(panel33, new GridConstraints(3, 0, 1, 3, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, null, null, 0, false)); settingAppearanceSaveButton = new JButton(); settingAppearanceSaveButton.setIcon(new ImageIcon(getClass().getResource("/icon/menu-saveall_dark.png"))); settingAppearanceSaveButton.setText("保存"); - panel31.add(settingAppearanceSaveButton, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); - final Spacer spacer16 = new Spacer(); - panel31.add(spacer16, new GridConstraints(0, 1, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, 1, null, null, null, 0, false)); - final JPanel panel32 = new JPanel(); - panel32.setLayout(new GridLayoutManager(3, 3, new Insets(15, 15, 10, 0), -1, -1)); - Font panel32Font = this.$$$getFont$$$("Microsoft YaHei UI", -1, -1, panel32.getFont()); - if (panel32Font != null) panel32.setFont(panel32Font); - panel3.add(panel32, new GridConstraints(10, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, null, null, 0, false)); - panel32.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEmptyBorder(), "HTTP请求", TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION, this.$$$getFont$$$(null, Font.BOLD, -1, panel32.getFont()))); - final JPanel panel33 = new JPanel(); - panel33.setLayout(new GridLayoutManager(1, 2, new Insets(0, 0, 0, 0), -1, -1)); - panel32.add(panel33, new GridConstraints(2, 0, 1, 3, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, null, null, 0, false)); + panel33.add(settingAppearanceSaveButton, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + final Spacer spacer17 = new Spacer(); + panel33.add(spacer17, new GridConstraints(0, 1, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, 1, null, null, null, 0, false)); + final JPanel panel34 = new JPanel(); + panel34.setLayout(new GridLayoutManager(3, 3, new Insets(15, 15, 10, 0), -1, -1)); + Font panel34Font = this.$$$getFont$$$("Microsoft YaHei UI", -1, -1, panel34.getFont()); + if (panel34Font != null) panel34.setFont(panel34Font); + panel3.add(panel34, new GridConstraints(11, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, null, null, 0, false)); + panel34.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEmptyBorder(), "HTTP请求", TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION, this.$$$getFont$$$(null, Font.BOLD, -1, panel34.getFont()))); + final JPanel panel35 = new JPanel(); + panel35.setLayout(new GridLayoutManager(1, 2, new Insets(0, 0, 0, 0), -1, -1)); + panel34.add(panel35, new GridConstraints(2, 0, 1, 3, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, null, null, 0, false)); httpSaveButton = new JButton(); httpSaveButton.setIcon(new ImageIcon(getClass().getResource("/icon/menu-saveall_dark.png"))); httpSaveButton.setText("保存"); - panel33.add(httpSaveButton, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); - final Spacer spacer17 = new Spacer(); - panel33.add(spacer17, new GridConstraints(0, 1, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, 1, null, null, null, 0, false)); + panel35.add(httpSaveButton, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + final Spacer spacer18 = new Spacer(); + panel35.add(spacer18, new GridConstraints(0, 1, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, 1, null, null, null, 0, false)); httpUseProxyCheckBox = new JCheckBox(); httpUseProxyCheckBox.setText("使用HTTP代理"); - panel32.add(httpUseProxyCheckBox, new GridConstraints(0, 0, 1, 3, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + panel34.add(httpUseProxyCheckBox, new GridConstraints(0, 0, 1, 3, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); httpProxyPanel = new JPanel(); httpProxyPanel.setLayout(new GridLayoutManager(4, 2, new Insets(0, 26, 0, 0), -1, -1)); - panel32.add(httpProxyPanel, new GridConstraints(1, 0, 1, 3, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, null, null, 0, false)); - final JLabel label50 = new JLabel(); - label50.setText("Host"); - httpProxyPanel.add(label50, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + panel34.add(httpProxyPanel, new GridConstraints(1, 0, 1, 3, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, null, null, 0, false)); + final JLabel label51 = new JLabel(); + label51.setText("Host"); + httpProxyPanel.add(label51, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); httpProxyHostTextField = new JTextField(); httpProxyPanel.add(httpProxyHostTextField, new GridConstraints(0, 1, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_FIXED, null, new Dimension(150, -1), null, 0, false)); - final JLabel label51 = new JLabel(); - label51.setText("端口"); - httpProxyPanel.add(label51, new GridConstraints(1, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); final JLabel label52 = new JLabel(); - label52.setText("用户名"); - httpProxyPanel.add(label52, new GridConstraints(2, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + label52.setText("端口"); + httpProxyPanel.add(label52, new GridConstraints(1, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); final JLabel label53 = new JLabel(); - label53.setText("密码"); - httpProxyPanel.add(label53, new GridConstraints(3, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + label53.setText("用户名"); + httpProxyPanel.add(label53, new GridConstraints(2, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + final JLabel label54 = new JLabel(); + label54.setText("密码"); + httpProxyPanel.add(label54, new GridConstraints(3, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); httpProxyPortTextField = new JTextField(); httpProxyPanel.add(httpProxyPortTextField, new GridConstraints(1, 1, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_FIXED, null, new Dimension(150, -1), null, 0, false)); httpProxyUserTextField = new JTextField(); diff --git a/src/main/java/com/fangxuele/tool/push/ui/listener/SettingListener.java b/src/main/java/com/fangxuele/tool/push/ui/listener/SettingListener.java index dead114f..f4790f0c 100644 --- a/src/main/java/com/fangxuele/tool/push/ui/listener/SettingListener.java +++ b/src/main/java/com/fangxuele/tool/push/ui/listener/SettingListener.java @@ -5,21 +5,10 @@ import com.fangxuele.tool.push.App; import com.fangxuele.tool.push.dao.TWxAccountMapper; import com.fangxuele.tool.push.domain.TWxAccount; -import com.fangxuele.tool.push.logic.msgsender.AliYunMsgSender; -import com.fangxuele.tool.push.logic.msgsender.HttpMsgSender; -import com.fangxuele.tool.push.logic.msgsender.HwYunMsgSender; -import com.fangxuele.tool.push.logic.msgsender.MailMsgSender; -import com.fangxuele.tool.push.logic.msgsender.TxYunMsgSender; -import com.fangxuele.tool.push.logic.msgsender.WxMaTemplateMsgSender; -import com.fangxuele.tool.push.logic.msgsender.WxMpTemplateMsgSender; -import com.fangxuele.tool.push.logic.msgsender.YunPianMsgSender; +import com.fangxuele.tool.push.logic.msgsender.*; import com.fangxuele.tool.push.ui.Init; import com.fangxuele.tool.push.ui.UiConsts; -import com.fangxuele.tool.push.ui.dialog.CommonTipsDialog; -import com.fangxuele.tool.push.ui.dialog.DingAppDialog; -import com.fangxuele.tool.push.ui.dialog.MailTestDialog; -import com.fangxuele.tool.push.ui.dialog.SwitchWxAccountDialog; -import com.fangxuele.tool.push.ui.dialog.WxCpAppDialog; +import com.fangxuele.tool.push.ui.dialog.*; import com.fangxuele.tool.push.ui.form.MainWindow; import com.fangxuele.tool.push.ui.form.SettingForm; import com.fangxuele.tool.push.ui.form.msg.DingMsgForm; @@ -335,7 +324,24 @@ public static void addListeners() { App.config.setBdInvokeId(settingForm.getBdInvokeIdTextField().getText()); App.config.save(); -// TODO HwYunMsgSender.closeableHttpClient = null; + BdYunMsgSender.smsClient = null; + + JOptionPane.showMessageDialog(settingPanel, "保存成功!", "成功", + JOptionPane.INFORMATION_MESSAGE); + } catch (Exception e1) { + JOptionPane.showMessageDialog(settingPanel, "保存失败!\n\n" + e1.getMessage(), "失败", + JOptionPane.ERROR_MESSAGE); + logger.error(e1); + } + }); + + // 设置-又拍云短信-保存 + settingForm.getUpSaveButton().addActionListener(e -> { + try { + App.config.setUpAuthorizationToken(settingForm.getUpAuthorizationTokenTextField().getText()); + App.config.save(); + +// TODO BdYunMsgSender.smsClient = null; JOptionPane.showMessageDialog(settingPanel, "保存成功!", "成功", JOptionPane.INFORMATION_MESSAGE); diff --git a/src/main/java/com/fangxuele/tool/push/util/ConfigUtil.java b/src/main/java/com/fangxuele/tool/push/util/ConfigUtil.java index f1cd243a..d2e62117 100644 --- a/src/main/java/com/fangxuele/tool/push/util/ConfigUtil.java +++ b/src/main/java/com/fangxuele/tool/push/util/ConfigUtil.java @@ -152,6 +152,8 @@ private ConfigUtil() { private String bdEndPoint; private String bdInvokeId; + private String upAuthorizationToken; + private String yunpianApiKey; private boolean httpUseProxy; @@ -864,6 +866,14 @@ public void setBdInvokeId(String bdInvokeId) { setting.put("setting.bdyun", "bdInvokeId", bdInvokeId); } + public String getUpAuthorizationToken() { + return setting.getStr("upAuthorizationToken", "setting.upyun", ""); + } + + public void setUpAuthorizationToken(String upAuthorizationToken) { + setting.put("setting.upyun", "upAuthorizationToken", upAuthorizationToken); + } + public String getYunpianApiKey() { return setting.getStr("apiKey", "setting.yunpian", ""); } From 33f13ab5a12de4f85f2203f6ccd9ea293b94dfc5 Mon Sep 17 00:00:00 2001 From: sunsence Date: Sun, 15 Sep 2019 19:09:03 +0800 Subject: [PATCH 02/16] =?UTF-8?q?feature:=E5=A2=9E=E5=8A=A0=E5=AF=B9?= =?UTF-8?q?=E5=8F=88=E6=8B=8D=E4=BA=91=E7=9F=AD=E4=BF=A1=E7=9A=84=E6=94=AF?= =?UTF-8?q?=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tool/push/logic/PushControl.java | 10 + .../push/logic/msgmaker/MsgMakerFactory.java | 3 + .../push/logic/msgmaker/UpYunMsgMaker.java | 61 ++++ .../logic/msgsender/MsgSenderFactory.java | 3 + .../push/logic/msgsender/UpYunMsgSender.java | 86 +++++ .../tool/push/ui/form/MessageEditForm.java | 17 +- .../tool/push/ui/form/MessageTypeForm.form | 20 +- .../tool/push/ui/form/MessageTypeForm.java | 10 +- .../tool/push/ui/form/msg/MsgFormFactory.java | 3 + .../tool/push/ui/form/msg/UpYunMsgForm.form | 121 +++++++ .../tool/push/ui/form/msg/UpYunMsgForm.java | 315 ++++++++++++++++++ .../push/ui/listener/MsgEditListener.java | 2 +- 12 files changed, 622 insertions(+), 29 deletions(-) create mode 100644 src/main/java/com/fangxuele/tool/push/logic/msgmaker/UpYunMsgMaker.java create mode 100644 src/main/java/com/fangxuele/tool/push/logic/msgsender/UpYunMsgSender.java create mode 100644 src/main/java/com/fangxuele/tool/push/ui/form/msg/UpYunMsgForm.form create mode 100644 src/main/java/com/fangxuele/tool/push/ui/form/msg/UpYunMsgForm.java diff --git a/src/main/java/com/fangxuele/tool/push/logic/PushControl.java b/src/main/java/com/fangxuele/tool/push/logic/PushControl.java index c3933743..7110b679 100644 --- a/src/main/java/com/fangxuele/tool/push/logic/PushControl.java +++ b/src/main/java/com/fangxuele/tool/push/logic/PushControl.java @@ -186,6 +186,16 @@ public static boolean configCheck() { return false; } break; + case MessageTypeEnum.UP_YUN_CODE: + String upAuthorizationToken = App.config.getUpAuthorizationToken(); + + if (StringUtils.isEmpty(upAuthorizationToken)) { + JOptionPane.showMessageDialog(settingForm.getSettingPanel(), + "请先在设置中填写并保存又拍云短信相关配置!", "提示", + JOptionPane.INFORMATION_MESSAGE); + return false; + } + break; case MessageTypeEnum.BD_YUN_CODE: String bdAccessKeyId = App.config.getBdAccessKeyId(); String bdSecretAccessKey = App.config.getBdSecretAccessKey(); diff --git a/src/main/java/com/fangxuele/tool/push/logic/msgmaker/MsgMakerFactory.java b/src/main/java/com/fangxuele/tool/push/logic/msgmaker/MsgMakerFactory.java index 436b30ab..f312fccb 100644 --- a/src/main/java/com/fangxuele/tool/push/logic/msgmaker/MsgMakerFactory.java +++ b/src/main/java/com/fangxuele/tool/push/logic/msgmaker/MsgMakerFactory.java @@ -57,6 +57,9 @@ public static IMsgMaker getMsgMaker() { case MessageTypeEnum.BD_YUN_CODE: iMsgMaker = new BdYunMsgMaker(); break; + case MessageTypeEnum.UP_YUN_CODE: + iMsgMaker = new UpYunMsgMaker(); + break; default: } return iMsgMaker; diff --git a/src/main/java/com/fangxuele/tool/push/logic/msgmaker/UpYunMsgMaker.java b/src/main/java/com/fangxuele/tool/push/logic/msgmaker/UpYunMsgMaker.java new file mode 100644 index 00000000..b6209eb5 --- /dev/null +++ b/src/main/java/com/fangxuele/tool/push/logic/msgmaker/UpYunMsgMaker.java @@ -0,0 +1,61 @@ +package com.fangxuele.tool.push.logic.msgmaker; + +import com.fangxuele.tool.push.ui.form.msg.UpYunMsgForm; +import com.fangxuele.tool.push.util.TemplateUtil; +import org.apache.commons.compress.utils.Lists; +import org.apache.velocity.VelocityContext; + +import javax.swing.table.DefaultTableModel; +import java.util.List; + +/** + *
+ * 又拍云模板短信加工器
+ * 
+ * + * @author Zhou Bo + * @since 2019/6/14. + */ +public class UpYunMsgMaker extends BaseMsgMaker implements IMsgMaker{ + + public static int templateId; + + public static List paramList; + + /** + * 准备(界面字段等) + */ + @Override + public void prepare() { + templateId = Integer.parseInt(UpYunMsgForm.getInstance().getMsgTemplateIdTextField().getText()); + + if (UpYunMsgForm.getInstance().getTemplateMsgDataTable().getModel().getRowCount() == 0) { + UpYunMsgForm.initTemplateDataTable(); + } + + DefaultTableModel tableModel = (DefaultTableModel) UpYunMsgForm.getInstance().getTemplateMsgDataTable().getModel(); + int rowCount = tableModel.getRowCount(); + paramList = Lists.newArrayList(); + for (int i = 0; i < rowCount; i++) { + String value = ((String) tableModel.getValueAt(i, 1)); + paramList.add(value); + } + } + + /** + * 组织又拍云短信消息 + * + * @param msgData 消息信息 + * @return String[] + */ + @Override + public String[] makeMsg(String[] msgData) { + + VelocityContext velocityContext = getVelocityContext(msgData); + for (int i = 0; i < paramList.size(); i++) { + paramList.set(i, TemplateUtil.evaluate(paramList.get(i), velocityContext)); + } + String[] paramArray = new String[paramList.size()]; + return paramList.toArray(paramArray); + } +} diff --git a/src/main/java/com/fangxuele/tool/push/logic/msgsender/MsgSenderFactory.java b/src/main/java/com/fangxuele/tool/push/logic/msgsender/MsgSenderFactory.java index de074f27..51465d85 100644 --- a/src/main/java/com/fangxuele/tool/push/logic/msgsender/MsgSenderFactory.java +++ b/src/main/java/com/fangxuele/tool/push/logic/msgsender/MsgSenderFactory.java @@ -60,6 +60,9 @@ public static IMsgSender getMsgSender() { case MessageTypeEnum.BD_YUN_CODE: iMsgSender = new BdYunMsgSender(); break; + case MessageTypeEnum.UP_YUN_CODE: + iMsgSender = new UpYunMsgSender(); + break; default: break; } diff --git a/src/main/java/com/fangxuele/tool/push/logic/msgsender/UpYunMsgSender.java b/src/main/java/com/fangxuele/tool/push/logic/msgsender/UpYunMsgSender.java new file mode 100644 index 00000000..9edcdc41 --- /dev/null +++ b/src/main/java/com/fangxuele/tool/push/logic/msgsender/UpYunMsgSender.java @@ -0,0 +1,86 @@ +package com.fangxuele.tool.push.logic.msgsender; + +import com.fangxuele.tool.push.App; +import com.fangxuele.tool.push.logic.PushControl; +import com.fangxuele.tool.push.logic.msgmaker.UpYunMsgMaker; +import com.github.qcloudsms.SmsSingleSender; +import com.github.qcloudsms.SmsSingleSenderResult; +import lombok.extern.slf4j.Slf4j; + +/** + *
+ * 又拍云模板短信发送器
+ * 
+ * + * @author RememBerBer + * @since 2019/6/15. + */ +@Slf4j +public class UpYunMsgSender implements IMsgSender { + /** + * 又拍云短信sender + */ + public volatile static SmsSingleSender smsSingleSender; + + private UpYunMsgMaker upYunMsgMaker; + + public UpYunMsgSender() { + upYunMsgMaker = new UpYunMsgMaker(); + smsSingleSender = getTxYunSender(); + } + + @Override + public SendResult send(String[] msgData) { + SendResult sendResult = new SendResult(); + try { + int templateId = UpYunMsgMaker.templateId; + String smsSign = App.config.getTxyunSign(); + String[] params = upYunMsgMaker.makeMsg(msgData); + String telNum = msgData[0]; + if (PushControl.dryRun) { + sendResult.setSuccess(true); + return sendResult; + } else { + SmsSingleSenderResult result = smsSingleSender.sendWithParam("86", telNum, + templateId, params, smsSign, "", ""); + + if (result.result == 0) { + sendResult.setSuccess(true); + } else { + sendResult.setSuccess(false); + sendResult.setInfo(result.toString()); + } + } + } catch (Exception e) { + sendResult.setSuccess(false); + sendResult.setInfo(e.getMessage()); + log.error(e.toString()); + } + + return sendResult; + } + + @Override + public SendResult asyncSend(String[] msgData) { + return null; + } + + /** + * 获取又拍云短信发送客户端 + * + * @return SmsSingleSender + */ + private static SmsSingleSender getTxYunSender() { + if (smsSingleSender == null) { + synchronized (UpYunMsgSender.class) { + if (smsSingleSender == null) { + String txyunAppId = App.config.getTxyunAppId(); + String txyunAppKey = App.config.getTxyunAppKey(); + + smsSingleSender = new SmsSingleSender(Integer.parseInt(txyunAppId), txyunAppKey); + } + } + } + return smsSingleSender; + } +} diff --git a/src/main/java/com/fangxuele/tool/push/ui/form/MessageEditForm.java b/src/main/java/com/fangxuele/tool/push/ui/form/MessageEditForm.java index 1435c0f0..07c7a777 100644 --- a/src/main/java/com/fangxuele/tool/push/ui/form/MessageEditForm.java +++ b/src/main/java/com/fangxuele/tool/push/ui/form/MessageEditForm.java @@ -2,19 +2,7 @@ import com.fangxuele.tool.push.App; import com.fangxuele.tool.push.logic.MessageTypeEnum; -import com.fangxuele.tool.push.ui.form.msg.AliYunMsgForm; -import com.fangxuele.tool.push.ui.form.msg.BdYunMsgForm; -import com.fangxuele.tool.push.ui.form.msg.DingMsgForm; -import com.fangxuele.tool.push.ui.form.msg.HttpMsgForm; -import com.fangxuele.tool.push.ui.form.msg.HwYunMsgForm; -import com.fangxuele.tool.push.ui.form.msg.KefuMsgForm; -import com.fangxuele.tool.push.ui.form.msg.MaTemplateMsgForm; -import com.fangxuele.tool.push.ui.form.msg.MailMsgForm; -import com.fangxuele.tool.push.ui.form.msg.MpTemplateMsgForm; -import com.fangxuele.tool.push.ui.form.msg.MsgFormFactory; -import com.fangxuele.tool.push.ui.form.msg.TxYunMsgForm; -import com.fangxuele.tool.push.ui.form.msg.WxCpMsgForm; -import com.fangxuele.tool.push.ui.form.msg.YunpianMsgForm; +import com.fangxuele.tool.push.ui.form.msg.*; import com.fangxuele.tool.push.util.UndoUtil; import com.intellij.uiDesigner.core.GridConstraints; import com.intellij.uiDesigner.core.GridLayoutManager; @@ -114,6 +102,9 @@ public static void switchMsgType(int msgType) { case MessageTypeEnum.TX_YUN_CODE: messageEditForm.getMsgEditorPanel().add(TxYunMsgForm.getInstance().getTemplateMsgPanel(), gridConstraintsRow0); break; + case MessageTypeEnum.UP_YUN_CODE: + messageEditForm.getMsgEditorPanel().add(UpYunMsgForm.getInstance().getTemplateMsgPanel(), gridConstraintsRow0); + break; case MessageTypeEnum.HW_YUN_CODE: messageEditForm.getMsgEditorPanel().add(HwYunMsgForm.getInstance().getTemplateMsgPanel(), gridConstraintsRow0); break; diff --git a/src/main/java/com/fangxuele/tool/push/ui/form/MessageTypeForm.form b/src/main/java/com/fangxuele/tool/push/ui/form/MessageTypeForm.form index f78c41b9..49d35a90 100644 --- a/src/main/java/com/fangxuele/tool/push/ui/form/MessageTypeForm.form +++ b/src/main/java/com/fangxuele/tool/push/ui/form/MessageTypeForm.form @@ -85,15 +85,6 @@
- - - - - - - - - @@ -150,7 +141,7 @@ - + @@ -216,6 +207,15 @@ + + + + + + + + +
diff --git a/src/main/java/com/fangxuele/tool/push/ui/form/MessageTypeForm.java b/src/main/java/com/fangxuele/tool/push/ui/form/MessageTypeForm.java index e47543ac..a54ebe4a 100644 --- a/src/main/java/com/fangxuele/tool/push/ui/form/MessageTypeForm.java +++ b/src/main/java/com/fangxuele/tool/push/ui/form/MessageTypeForm.java @@ -228,10 +228,6 @@ public static void clearAllSelected() { yunPianRadioButton = new JRadioButton(); yunPianRadioButton.setText("云片网短信"); msgTypeListPanel.add(yunPianRadioButton, new GridConstraints(11, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); - upYunRadioButton = new JRadioButton(); - upYunRadioButton.setEnabled(false); - upYunRadioButton.setText("又拍云短信"); - msgTypeListPanel.add(upYunRadioButton, new GridConstraints(13, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); 网易云信短信RadioButton = new JRadioButton(); 网易云信短信RadioButton.setEnabled(false); 网易云信短信RadioButton.setText("网易云信短信"); @@ -259,7 +255,7 @@ public static void clearAllSelected() { eMailRadioButton = new JRadioButton(); eMailRadioButton.setEnabled(true); eMailRadioButton.setText("E-Mail(BETA)"); - msgTypeListPanel.add(eMailRadioButton, new GridConstraints(12, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + msgTypeListPanel.add(eMailRadioButton, new GridConstraints(13, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); wxCpRadioButton = new JRadioButton(); wxCpRadioButton.setEnabled(true); wxCpRadioButton.setText("企业号/企业微信"); @@ -286,6 +282,10 @@ public static void clearAllSelected() { bdYunRadioButton.setEnabled(true); bdYunRadioButton.setText("百度云短信(BETA)"); msgTypeListPanel.add(bdYunRadioButton, new GridConstraints(10, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + upYunRadioButton = new JRadioButton(); + upYunRadioButton.setEnabled(true); + upYunRadioButton.setText("又拍云短信(BETA)"); + msgTypeListPanel.add(upYunRadioButton, new GridConstraints(12, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); final JPanel panel1 = new JPanel(); panel1.setLayout(new GridLayoutManager(2, 1, new Insets(8, 8, 8, 0), -1, -1)); messageTypePanel.add(panel1, new GridConstraints(1, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, null, null, 0, false)); diff --git a/src/main/java/com/fangxuele/tool/push/ui/form/msg/MsgFormFactory.java b/src/main/java/com/fangxuele/tool/push/ui/form/msg/MsgFormFactory.java index da73ea72..08ff5fee 100644 --- a/src/main/java/com/fangxuele/tool/push/ui/form/msg/MsgFormFactory.java +++ b/src/main/java/com/fangxuele/tool/push/ui/form/msg/MsgFormFactory.java @@ -41,6 +41,9 @@ public static IMsgForm getMsgForm() { case MessageTypeEnum.TX_YUN_CODE: iMsgForm = TxYunMsgForm.getInstance(); break; + case MessageTypeEnum.UP_YUN_CODE: + iMsgForm = UpYunMsgForm.getInstance(); + break; case MessageTypeEnum.HW_YUN_CODE: iMsgForm = HwYunMsgForm.getInstance(); break; diff --git a/src/main/java/com/fangxuele/tool/push/ui/form/msg/UpYunMsgForm.form b/src/main/java/com/fangxuele/tool/push/ui/form/msg/UpYunMsgForm.form new file mode 100644 index 00000000..5fa6ec5c --- /dev/null +++ b/src/main/java/com/fangxuele/tool/push/ui/form/msg/UpYunMsgForm.form @@ -0,0 +1,121 @@ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/java/com/fangxuele/tool/push/ui/form/msg/UpYunMsgForm.java b/src/main/java/com/fangxuele/tool/push/ui/form/msg/UpYunMsgForm.java new file mode 100644 index 00000000..1d01e763 --- /dev/null +++ b/src/main/java/com/fangxuele/tool/push/ui/form/msg/UpYunMsgForm.java @@ -0,0 +1,315 @@ +package com.fangxuele.tool.push.ui.form.msg; + +import com.fangxuele.tool.push.dao.TMsgSmsMapper; +import com.fangxuele.tool.push.dao.TTemplateDataMapper; +import com.fangxuele.tool.push.domain.TMsgSms; +import com.fangxuele.tool.push.domain.TTemplateData; +import com.fangxuele.tool.push.logic.MessageTypeEnum; +import com.fangxuele.tool.push.ui.component.TableInCellButtonColumn; +import com.fangxuele.tool.push.ui.form.MainWindow; +import com.fangxuele.tool.push.ui.form.MessageEditForm; +import com.fangxuele.tool.push.util.MybatisUtil; +import com.fangxuele.tool.push.util.SqliteUtil; +import com.intellij.uiDesigner.core.GridConstraints; +import com.intellij.uiDesigner.core.GridLayoutManager; +import lombok.Getter; +import org.apache.commons.lang3.StringUtils; + +import javax.swing.*; +import javax.swing.border.TitledBorder; +import javax.swing.table.DefaultTableCellRenderer; +import javax.swing.table.DefaultTableModel; +import javax.swing.table.TableColumnModel; +import java.awt.*; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** + *
+ * UpYunMsgForm
+ * 
+ * + * @author Zhou Bo + * @since 2019/6/3. + */ +@Getter +public class UpYunMsgForm implements IMsgForm { + private JPanel templateMsgPanel; + private JLabel templateIdLabel; + private JTextField msgTemplateIdTextField; + private JPanel templateMsgDataPanel; + private JLabel templateMsgNameLabel; + private JTextField templateDataNameTextField; + private JLabel templateMsgValueLabel; + private JTextField templateDataValueTextField; + private JButton templateMsgDataAddButton; + private JTable templateMsgDataTable; + + private static UpYunMsgForm upYunMsgForm; + + private static TMsgSmsMapper msgSmsMapper = MybatisUtil.getSqlSession().getMapper(TMsgSmsMapper.class); + private static TTemplateDataMapper templateDataMapper = MybatisUtil.getSqlSession().getMapper(TTemplateDataMapper.class); + + public UpYunMsgForm() { + // 模板数据-添加 按钮事件 + templateMsgDataAddButton.addActionListener(e -> { + String[] data = new String[2]; + data[0] = getInstance().getTemplateDataNameTextField().getText(); + data[1] = getInstance().getTemplateDataValueTextField().getText(); + + if (getInstance().getTemplateMsgDataTable().getModel().getRowCount() == 0) { + initTemplateDataTable(); + } + + DefaultTableModel tableModel = (DefaultTableModel) getInstance().getTemplateMsgDataTable() + .getModel(); + int rowCount = tableModel.getRowCount(); + + Set keySet = new HashSet<>(); + String keyData; + for (int i = 0; i < rowCount; i++) { + keyData = (String) tableModel.getValueAt(i, 0); + keySet.add(keyData); + } + + if (StringUtils.isEmpty(data[0]) || StringUtils.isEmpty(data[1])) { + JOptionPane.showMessageDialog(MessageEditForm.getInstance().getMsgEditorPanel(), "模板参数和参数对应的值不能为空!", "提示", + JOptionPane.INFORMATION_MESSAGE); + } else if (keySet.contains(data[0])) { + JOptionPane.showMessageDialog(MessageEditForm.getInstance().getMsgEditorPanel(), "模板参数不能重复!", "提示", + JOptionPane.INFORMATION_MESSAGE); + } else { + tableModel.addRow(data); + } + }); + } + + @Override + public void init(String msgName) { + clearAllField(); + List tMsgSmsList = msgSmsMapper.selectByMsgTypeAndMsgName(MessageTypeEnum.UP_YUN_CODE, msgName); + Integer msgId = 0; + if (tMsgSmsList.size() > 0) { + TMsgSms tMsgSms = tMsgSmsList.get(0); + msgId = tMsgSms.getId(); + getInstance().getMsgTemplateIdTextField().setText(tMsgSms.getTemplateId()); + } + + initTemplateDataTable(); + // 模板消息Data表 + List templateDataList = templateDataMapper.selectByMsgTypeAndMsgId(MessageTypeEnum.UP_YUN_CODE, msgId); + String[] headerNames = {"模板参数", "参数对应的值", "操作"}; + Object[][] cellData = new String[templateDataList.size()][headerNames.length]; + for (int i = 0; i < templateDataList.size(); i++) { + TTemplateData tTemplateData = templateDataList.get(i); + cellData[i][0] = tTemplateData.getName(); + cellData[i][1] = tTemplateData.getValue(); + } + DefaultTableModel model = new DefaultTableModel(cellData, headerNames); + getInstance().getTemplateMsgDataTable().setModel(model); + TableColumnModel tableColumnModel = getInstance().getTemplateMsgDataTable().getColumnModel(); + tableColumnModel.getColumn(headerNames.length - 1). + setCellRenderer(new TableInCellButtonColumn(getInstance().getTemplateMsgDataTable(), headerNames.length - 1)); + tableColumnModel.getColumn(headerNames.length - 1). + setCellEditor(new TableInCellButtonColumn(getInstance().getTemplateMsgDataTable(), headerNames.length - 1)); + + // 设置列宽 + tableColumnModel.getColumn(2).setPreferredWidth(46); + tableColumnModel.getColumn(2).setMaxWidth(46); + } + + @Override + public void save(String msgName) { + int msgId = 0; + boolean existSameMsg = false; + + List tMsgSmsList = msgSmsMapper.selectByMsgTypeAndMsgName(MessageTypeEnum.UP_YUN_CODE, msgName); + if (tMsgSmsList.size() > 0) { + existSameMsg = true; + msgId = tMsgSmsList.get(0).getId(); + } + + int isCover = JOptionPane.NO_OPTION; + if (existSameMsg) { + // 如果存在,是否覆盖 + isCover = JOptionPane.showConfirmDialog(MainWindow.getInstance().getMessagePanel(), "已经存在同名的历史消息,\n是否覆盖?", "确认", + JOptionPane.YES_NO_OPTION); + } + + if (!existSameMsg || isCover == JOptionPane.YES_OPTION) { + String templateId = getInstance().getMsgTemplateIdTextField().getText(); + + String now = SqliteUtil.nowDateForSqlite(); + + TMsgSms tMsgSms = new TMsgSms(); + tMsgSms.setMsgType(MessageTypeEnum.UP_YUN_CODE); + tMsgSms.setMsgName(msgName); + tMsgSms.setTemplateId(templateId); + tMsgSms.setCreateTime(now); + tMsgSms.setModifiedTime(now); + + if (existSameMsg) { + msgSmsMapper.updateByMsgTypeAndMsgName(tMsgSms); + } else { + msgSmsMapper.insertSelective(tMsgSms); + msgId = tMsgSms.getId(); + } + + // 保存模板数据 + // 如果是覆盖保存,则先清空之前的模板数据 + if (existSameMsg) { + templateDataMapper.deleteByMsgTypeAndMsgId(MessageTypeEnum.UP_YUN_CODE, msgId); + } + + // 如果table为空,则初始化 + if (getInstance().getTemplateMsgDataTable().getModel().getRowCount() == 0) { + initTemplateDataTable(); + } + + // 逐行读取 + DefaultTableModel tableModel = (DefaultTableModel) getInstance().getTemplateMsgDataTable() + .getModel(); + int rowCount = tableModel.getRowCount(); + for (int i = 0; i < rowCount; i++) { + String name = (String) tableModel.getValueAt(i, 0); + String value = (String) tableModel.getValueAt(i, 1); + + TTemplateData tTemplateData = new TTemplateData(); + tTemplateData.setMsgType(MessageTypeEnum.UP_YUN_CODE); + tTemplateData.setMsgId(msgId); + tTemplateData.setName(name); + tTemplateData.setValue(value); + tTemplateData.setCreateTime(now); + tTemplateData.setModifiedTime(now); + + templateDataMapper.insert(tTemplateData); + } + + JOptionPane.showMessageDialog(MainWindow.getInstance().getMessagePanel(), "保存成功!", "成功", + JOptionPane.INFORMATION_MESSAGE); + } + + } + + public static UpYunMsgForm getInstance() { + if (upYunMsgForm == null) { + upYunMsgForm = new UpYunMsgForm(); + } + return upYunMsgForm; + } + + /** + * 初始化模板消息数据table + */ + public static void initTemplateDataTable() { + JTable msgDataTable = getInstance().getTemplateMsgDataTable(); + String[] headerNames = {"模板参数", "参数对应的值", "操作"}; + DefaultTableModel model = new DefaultTableModel(null, headerNames); + msgDataTable.setModel(model); + msgDataTable.updateUI(); + DefaultTableCellRenderer hr = (DefaultTableCellRenderer) msgDataTable.getTableHeader().getDefaultRenderer(); + // 表头列名居左 + hr.setHorizontalAlignment(DefaultTableCellRenderer.LEFT); + + TableColumnModel tableColumnModel = msgDataTable.getColumnModel(); + tableColumnModel.getColumn(headerNames.length - 1). + setCellRenderer(new TableInCellButtonColumn(msgDataTable, headerNames.length - 1)); + tableColumnModel.getColumn(headerNames.length - 1). + setCellEditor(new TableInCellButtonColumn(msgDataTable, headerNames.length - 1)); + + // 设置列宽 + tableColumnModel.getColumn(2).setPreferredWidth(46); + tableColumnModel.getColumn(2).setMaxWidth(46); + } + + /** + * 清空所有界面字段 + */ + public static void clearAllField() { + getInstance().getMsgTemplateIdTextField().setText(""); + getInstance().getTemplateDataNameTextField().setText(""); + getInstance().getTemplateDataValueTextField().setText(""); + initTemplateDataTable(); + } + + { +// GUI initializer generated by IntelliJ IDEA GUI Designer +// >>> IMPORTANT!! <<< +// DO NOT EDIT OR ADD ANY CODE HERE! + $$$setupUI$$$(); + } + + /** + * Method generated by IntelliJ IDEA GUI Designer + * >>> IMPORTANT!! <<< + * DO NOT edit this method OR call it in your code! + * + * @noinspection ALL + */ + private void $$$setupUI$$$() { + final JPanel panel1 = new JPanel(); + panel1.setLayout(new GridLayoutManager(1, 1, new Insets(0, 0, 0, 0), -1, -1)); + templateMsgPanel = new JPanel(); + templateMsgPanel.setLayout(new GridLayoutManager(2, 3, new Insets(10, 5, 0, 0), -1, -1)); + panel1.add(templateMsgPanel, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_WANT_GROW, null, null, null, 0, false)); + templateMsgPanel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEmptyBorder(), "", TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION, this.$$$getFont$$$(null, Font.BOLD, -1, templateMsgPanel.getFont()))); + templateMsgDataPanel = new JPanel(); + templateMsgDataPanel.setLayout(new GridLayoutManager(3, 3, new Insets(10, 0, 0, 0), -1, -1)); + templateMsgPanel.add(templateMsgDataPanel, new GridConstraints(1, 0, 1, 3, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_WANT_GROW, null, null, null, 0, false)); + templateMsgDataPanel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), "短信模板变量(可使用\"$ENTER$\"作为换行符)", TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION, this.$$$getFont$$$(null, Font.BOLD, -1, templateMsgDataPanel.getFont()))); + templateDataNameTextField = new JTextField(); + templateDataNameTextField.setToolTipText("当消息类型是模板消息时的示例:first或者keyword1或者remark之类的"); + templateMsgDataPanel.add(templateDataNameTextField, new GridConstraints(1, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_FIXED, null, new Dimension(150, -1), null, 0, false)); + templateDataValueTextField = new JTextField(); + templateMsgDataPanel.add(templateDataValueTextField, new GridConstraints(1, 1, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_FIXED, null, new Dimension(150, -1), null, 0, false)); + templateMsgDataAddButton = new JButton(); + templateMsgDataAddButton.setIcon(new ImageIcon(getClass().getResource("/icon/add.png"))); + templateMsgDataAddButton.setText(""); + templateMsgDataPanel.add(templateMsgDataAddButton, new GridConstraints(1, 2, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + templateMsgDataTable = new JTable(); + templateMsgDataTable.setAutoCreateColumnsFromModel(true); + templateMsgDataTable.setAutoCreateRowSorter(true); + templateMsgDataTable.setGridColor(new Color(-12236470)); + templateMsgDataTable.setRowHeight(36); + templateMsgDataPanel.add(templateMsgDataTable, new GridConstraints(2, 0, 1, 3, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_WANT_GROW, null, null, null, 0, false)); + templateMsgNameLabel = new JLabel(); + templateMsgNameLabel.setText("模板参数"); + templateMsgNameLabel.setToolTipText("当消息类型是模板消息时的示例:first或者keyword1或者remark之类的"); + templateMsgDataPanel.add(templateMsgNameLabel, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + templateMsgValueLabel = new JLabel(); + templateMsgValueLabel.setText("参数对应的值"); + templateMsgDataPanel.add(templateMsgValueLabel, new GridConstraints(0, 1, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + final JPanel panel2 = new JPanel(); + panel2.setLayout(new GridLayoutManager(1, 2, new Insets(0, 5, 10, 5), -1, -1)); + templateMsgPanel.add(panel2, new GridConstraints(0, 0, 1, 3, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, null, null, 0, false)); + templateIdLabel = new JLabel(); + templateIdLabel.setText("短信模板ID *"); + panel2.add(templateIdLabel, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + msgTemplateIdTextField = new JTextField(); + panel2.add(msgTemplateIdTextField, new GridConstraints(0, 1, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_FIXED, null, new Dimension(150, -1), null, 0, false)); + templateMsgNameLabel.setLabelFor(templateDataNameTextField); + templateMsgValueLabel.setLabelFor(templateDataValueTextField); + templateIdLabel.setLabelFor(msgTemplateIdTextField); + } + + /** + * @noinspection ALL + */ + private Font $$$getFont$$$(String fontName, int style, int size, Font currentFont) { + if (currentFont == null) return null; + String resultName; + if (fontName == null) { + resultName = currentFont.getName(); + } else { + Font testFont = new Font(fontName, Font.PLAIN, 10); + if (testFont.canDisplay('a') && testFont.canDisplay('1')) { + resultName = fontName; + } else { + resultName = currentFont.getName(); + } + } + return new Font(resultName, style >= 0 ? style : currentFont.getStyle(), size >= 0 ? size : currentFont.getSize()); + } + +} diff --git a/src/main/java/com/fangxuele/tool/push/ui/listener/MsgEditListener.java b/src/main/java/com/fangxuele/tool/push/ui/listener/MsgEditListener.java index 8653f78a..796e27f5 100644 --- a/src/main/java/com/fangxuele/tool/push/ui/listener/MsgEditListener.java +++ b/src/main/java/com/fangxuele/tool/push/ui/listener/MsgEditListener.java @@ -160,7 +160,7 @@ public void mousePressed(MouseEvent e) { paraDemo = "manager9115|manager9116|manager9117"; } else if (msgType == MessageTypeEnum.ALI_YUN_CODE || msgType == MessageTypeEnum.TX_YUN_CODE || msgType == MessageTypeEnum.HW_YUN_CODE || msgType == MessageTypeEnum.BD_YUN_CODE - || msgType == MessageTypeEnum.YUN_PIAN_CODE) { + || msgType == MessageTypeEnum.UP_YUN_CODE || msgType == MessageTypeEnum.YUN_PIAN_CODE) { fillParaName = "预览消息用户的手机号"; paraDemo = "13910733521;13910733522"; } From 3c75679402e5bcc82c872d4d8762abedf89e6faf Mon Sep 17 00:00:00 2001 From: sunsence Date: Sun, 15 Sep 2019 21:05:04 +0800 Subject: [PATCH 03/16] =?UTF-8?q?feature:=E5=A2=9E=E5=8A=A0=E5=AF=B9?= =?UTF-8?q?=E5=8F=88=E6=8B=8D=E4=BA=91=E7=9F=AD=E4=BF=A1=E7=9A=84=E6=94=AF?= =?UTF-8?q?=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../push/logic/msgmaker/UpYunMsgMaker.java | 4 +- .../push/logic/msgsender/UpYunMsgSender.java | 48 ++++++++----------- .../push/ui/listener/SettingListener.java | 2 +- 3 files changed, 22 insertions(+), 32 deletions(-) diff --git a/src/main/java/com/fangxuele/tool/push/logic/msgmaker/UpYunMsgMaker.java b/src/main/java/com/fangxuele/tool/push/logic/msgmaker/UpYunMsgMaker.java index b6209eb5..9131a09e 100644 --- a/src/main/java/com/fangxuele/tool/push/logic/msgmaker/UpYunMsgMaker.java +++ b/src/main/java/com/fangxuele/tool/push/logic/msgmaker/UpYunMsgMaker.java @@ -18,7 +18,7 @@ */ public class UpYunMsgMaker extends BaseMsgMaker implements IMsgMaker{ - public static int templateId; + public static String templateId; public static List paramList; @@ -27,7 +27,7 @@ public class UpYunMsgMaker extends BaseMsgMaker implements IMsgMaker{ */ @Override public void prepare() { - templateId = Integer.parseInt(UpYunMsgForm.getInstance().getMsgTemplateIdTextField().getText()); + templateId = UpYunMsgForm.getInstance().getMsgTemplateIdTextField().getText(); if (UpYunMsgForm.getInstance().getTemplateMsgDataTable().getModel().getRowCount() == 0) { UpYunMsgForm.initTemplateDataTable(); diff --git a/src/main/java/com/fangxuele/tool/push/logic/msgsender/UpYunMsgSender.java b/src/main/java/com/fangxuele/tool/push/logic/msgsender/UpYunMsgSender.java index 9edcdc41..dddfe150 100644 --- a/src/main/java/com/fangxuele/tool/push/logic/msgsender/UpYunMsgSender.java +++ b/src/main/java/com/fangxuele/tool/push/logic/msgsender/UpYunMsgSender.java @@ -3,9 +3,8 @@ import com.fangxuele.tool.push.App; import com.fangxuele.tool.push.logic.PushControl; import com.fangxuele.tool.push.logic.msgmaker.UpYunMsgMaker; -import com.github.qcloudsms.SmsSingleSender; -import com.github.qcloudsms.SmsSingleSenderResult; import lombok.extern.slf4j.Slf4j; +import okhttp3.*; /** *
@@ -20,35 +19,44 @@ public class UpYunMsgSender implements IMsgSender {
     /**
      * 又拍云短信sender
      */
-    public volatile static SmsSingleSender smsSingleSender;
+    public volatile static OkHttpClient okHttpClint;
 
     private UpYunMsgMaker upYunMsgMaker;
 
+    private static final String URL = "https://sms-api.upyun.com/api/messages";
+
     public UpYunMsgSender() {
         upYunMsgMaker = new UpYunMsgMaker();
-        smsSingleSender = getTxYunSender();
+        okHttpClint = HttpMsgSender.getOkHttpClient();
     }
 
     @Override
     public SendResult send(String[] msgData) {
         SendResult sendResult = new SendResult();
         try {
-            int templateId = UpYunMsgMaker.templateId;
-            String smsSign = App.config.getTxyunSign();
+            String templateId = UpYunMsgMaker.templateId;
             String[] params = upYunMsgMaker.makeMsg(msgData);
             String telNum = msgData[0];
+
+            Request.Builder requestBuilder = new Request.Builder();
+            FormBody.Builder formBodyBuilder = new FormBody.Builder();
+            formBodyBuilder.add("mobile", telNum);
+            formBodyBuilder.add("template_id", templateId);
+            formBodyBuilder.add("vars", String.join("|", params));
+            RequestBody requestBody = formBodyBuilder.build();
+            requestBuilder.url(URL).post(requestBody);
+            requestBuilder.addHeader("Authorization", App.config.getUpAuthorizationToken());
+            Request request = requestBuilder.build();
             if (PushControl.dryRun) {
                 sendResult.setSuccess(true);
                 return sendResult;
             } else {
-                SmsSingleSenderResult result = smsSingleSender.sendWithParam("86", telNum,
-                        templateId, params, smsSign, "", "");
-
-                if (result.result == 0) {
+                Response response = okHttpClint.newCall(request).execute();
+                if (response.isSuccessful()) {
                     sendResult.setSuccess(true);
                 } else {
                     sendResult.setSuccess(false);
-                    sendResult.setInfo(result.toString());
+                    sendResult.setInfo(response.toString());
                 }
             }
         } catch (Exception e) {
@@ -65,22 +73,4 @@ public SendResult asyncSend(String[] msgData) {
         return null;
     }
 
-    /**
-     * 获取又拍云短信发送客户端
-     *
-     * @return SmsSingleSender
-     */
-    private static SmsSingleSender getTxYunSender() {
-        if (smsSingleSender == null) {
-            synchronized (UpYunMsgSender.class) {
-                if (smsSingleSender == null) {
-                    String txyunAppId = App.config.getTxyunAppId();
-                    String txyunAppKey = App.config.getTxyunAppKey();
-
-                    smsSingleSender = new SmsSingleSender(Integer.parseInt(txyunAppId), txyunAppKey);
-                }
-            }
-        }
-        return smsSingleSender;
-    }
 }
diff --git a/src/main/java/com/fangxuele/tool/push/ui/listener/SettingListener.java b/src/main/java/com/fangxuele/tool/push/ui/listener/SettingListener.java
index f4790f0c..4c6d85ba 100644
--- a/src/main/java/com/fangxuele/tool/push/ui/listener/SettingListener.java
+++ b/src/main/java/com/fangxuele/tool/push/ui/listener/SettingListener.java
@@ -341,7 +341,7 @@ public static void addListeners() {
                 App.config.setUpAuthorizationToken(settingForm.getUpAuthorizationTokenTextField().getText());
                 App.config.save();
 
-//            TODO    BdYunMsgSender.smsClient = null;
+                HttpMsgSender.okHttpClient = null;
 
                 JOptionPane.showMessageDialog(settingPanel, "保存成功!", "成功",
                         JOptionPane.INFORMATION_MESSAGE);

From 9cd2210029aad60a2a707b7c09a76cdc9d34c799 Mon Sep 17 00:00:00 2001
From: sunsence 
Date: Sun, 15 Sep 2019 21:15:20 +0800
Subject: [PATCH 04/16] =?UTF-8?q?feature:=E5=A2=9E=E5=8A=A0=E5=AF=B9?=
 =?UTF-8?q?=E4=B8=83=E7=89=9B=E4=BA=91=E7=9F=AD=E4=BF=A1=E7=9A=84=E6=94=AF?=
 =?UTF-8?q?=E6=8C=81=EF=BC=88=E7=AC=AC=E4=B8=80=E6=AD=A5=EF=BC=9A=E5=BC=95?=
 =?UTF-8?q?=E5=85=A5sdk=EF=BC=89?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 pom.xml | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/pom.xml b/pom.xml
index 86c4a246..67e81ea1 100644
--- a/pom.xml
+++ b/pom.xml
@@ -45,6 +45,8 @@
         2.3.1
         4.0.1
         1.1.0
+        0.10.75
+        7.2.25
     
 
     
@@ -306,7 +308,7 @@
         
             com.baidubce
             bce-java-sdk
-            0.10.75
+            ${bce-java-sdk.version}
             
                 
                     slf4j-api
@@ -387,6 +389,12 @@
             
         
 
+        
+            com.qiniu
+            qiniu-java-sdk
+            ${qiniu-java-sdk.version}
+        
+
     
 
     

From 1414e5f86f552f2906d9ac7ee25aab174789d63e Mon Sep 17 00:00:00 2001
From: sunsence 
Date: Sun, 15 Sep 2019 21:30:28 +0800
Subject: [PATCH 05/16] =?UTF-8?q?feature:=E5=A2=9E=E5=8A=A0=E5=AF=B9?=
 =?UTF-8?q?=E4=B8=83=E7=89=9B=E4=BA=91=E7=9F=AD=E4=BF=A1=E7=9A=84=E6=94=AF?=
 =?UTF-8?q?=E6=8C=81=EF=BC=88=E7=AC=AC=E4=BA=8C=E6=AD=A5=EF=BC=9A=E5=A2=9E?=
 =?UTF-8?q?=E5=8A=A0=E8=AE=BE=E7=BD=AE=EF=BC=89?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../tool/push/ui/form/SettingForm.form        |  82 +++++-
 .../tool/push/ui/form/SettingForm.java        | 252 ++++++++++--------
 .../push/ui/listener/SettingListener.java     |  18 ++
 .../fangxuele/tool/push/util/ConfigUtil.java  |  19 ++
 4 files changed, 254 insertions(+), 117 deletions(-)

diff --git a/src/main/java/com/fangxuele/tool/push/ui/form/SettingForm.form b/src/main/java/com/fangxuele/tool/push/ui/form/SettingForm.form
index 293ed61a..94834959 100644
--- a/src/main/java/com/fangxuele/tool/push/ui/form/SettingForm.form
+++ b/src/main/java/com/fangxuele/tool/push/ui/form/SettingForm.form
@@ -36,7 +36,7 @@
                       
                     
                   
-                  
+                  
                     
                     
                       
@@ -1197,12 +1197,82 @@
                           
                         
                       
-                      
+                      
                         
                         
                           
                         
                         
+                        
+                          
+                        
+                        
+                          
+                            
+                              
+                            
+                            
+                              
+                            
+                          
+                          
+                            
+                              
+                            
+                            
+                              
+                            
+                          
+                          
+                            
+                            
+                              
+                            
+                            
+                            
+                            
+                              
+                                
+                                  
+                                
+                                
+                                  
+                                  
+                                
+                              
+                              
+                                
+                                  
+                                
+                              
+                            
+                          
+                          
+                            
+                              
+                                
+                                
+                              
+                            
+                            
+                          
+                          
+                            
+                              
+                                
+                                
+                              
+                            
+                            
+                          
+                        
+                      
+                      
+                        
+                        
+                          
+                        
+                        
                         
                           
                         
@@ -1255,7 +1325,7 @@
                       
                         
                         
-                          
+                          
                         
                         
                         
@@ -1397,7 +1467,7 @@
                       
                         
                         
-                          
+                          
                         
                         
                         
@@ -1491,7 +1561,7 @@
                       
                         
                         
-                          
+                          
                         
                         
                         
@@ -1610,7 +1680,7 @@
                       
                         
                         
-                          
+                          
                         
                         
                           
diff --git a/src/main/java/com/fangxuele/tool/push/ui/form/SettingForm.java b/src/main/java/com/fangxuele/tool/push/ui/form/SettingForm.java
index 1e5f2832..5ce0b4bc 100644
--- a/src/main/java/com/fangxuele/tool/push/ui/form/SettingForm.java
+++ b/src/main/java/com/fangxuele/tool/push/ui/form/SettingForm.java
@@ -117,6 +117,9 @@ public class SettingForm {
     private JTextField bdInvokeIdTextField;
     private JTextField upAuthorizationTokenTextField;
     private JButton upSaveButton;
+    private JTextField qiniuAccessKeyTextField;
+    private JButton qiniuSaveButton;
+    private JTextField qiniuSecretKeyTextField;
 
     private static SettingForm settingForm;
     private static TWxAccountMapper wxAccountMapper = MybatisUtil.getSqlSession().getMapper(TWxAccountMapper.class);
@@ -218,6 +221,10 @@ public static void init() {
         // 又拍云短信
         settingForm.getUpAuthorizationTokenTextField().setText(App.config.getUpAuthorizationToken());
 
+        // 七牛云短信
+        settingForm.getQiniuAccessKeyTextField().setText(App.config.getQiniuAccessKey());
+        settingForm.getQiniuSecretKeyTextField().setText(App.config.getQiniuSecretKey());
+
         // 云片网短信
         settingForm.getYunpianApiKeyTextField().setText(App.config.getYunpianApiKey());
 
@@ -378,7 +385,7 @@ public static void toggleMpOutSideAccessTokenPanel() {
         final Spacer spacer1 = new Spacer();
         panel2.add(spacer1, new GridConstraints(1, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_VERTICAL, 1, GridConstraints.SIZEPOLICY_WANT_GROW, null, null, null, 0, false));
         final JPanel panel3 = new JPanel();
-        panel3.setLayout(new GridLayoutManager(15, 1, new Insets(40, 60, 0, 330), -1, -1));
+        panel3.setLayout(new GridLayoutManager(16, 1, new Insets(40, 60, 0, 330), -1, -1));
         panel2.add(panel3, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, new Dimension(600, -1), null, 0, false));
         final JPanel panel4 = new JPanel();
         panel4.setLayout(new GridLayoutManager(1, 1, new Insets(15, 15, 10, 0), -1, -1));
@@ -774,122 +781,145 @@ public static void toggleMpOutSideAccessTokenPanel() {
         upAuthorizationTokenTextField = new JTextField();
         panel24.add(upAuthorizationTokenTextField, new GridConstraints(0, 1, 1, 3, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, new Dimension(300, -1), new Dimension(300, -1), null, 0, false));
         final JPanel panel26 = new JPanel();
-        panel26.setLayout(new GridLayoutManager(2, 4, new Insets(15, 15, 10, 0), -1, -1));
+        panel26.setLayout(new GridLayoutManager(3, 4, new Insets(15, 15, 10, 0), -1, -1));
         panel3.add(panel26, new GridConstraints(10, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, null, null, 0, false));
-        panel26.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEmptyBorder(), "云片网短信", TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION, this.$$$getFont$$$(null, Font.BOLD, -1, panel26.getFont())));
+        panel26.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEmptyBorder(), "七牛云短信", TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION, this.$$$getFont$$$(null, Font.BOLD, -1, panel26.getFont())));
         final JLabel label39 = new JLabel();
-        label39.setText("ApiKey");
+        label39.setText("AcessKey");
         panel26.add(label39, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
-        yunpianApiKeyTextField = new JPasswordField();
-        yunpianApiKeyTextField.setText("");
-        panel26.add(yunpianApiKeyTextField, new GridConstraints(0, 1, 1, 3, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, new Dimension(300, -1), new Dimension(300, -1), null, 0, false));
+        final JLabel label40 = new JLabel();
+        label40.setText("SecretKey");
+        panel26.add(label40, new GridConstraints(1, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
         final JPanel panel27 = new JPanel();
         panel27.setLayout(new GridLayoutManager(1, 2, new Insets(0, 0, 0, 0), -1, -1));
-        panel26.add(panel27, new GridConstraints(1, 0, 1, 4, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, null, null, 0, false));
-        settingYunpianSaveButton = new JButton();
-        settingYunpianSaveButton.setIcon(new ImageIcon(getClass().getResource("/icon/menu-saveall_dark.png")));
-        settingYunpianSaveButton.setText("保存");
-        panel27.add(settingYunpianSaveButton, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
+        panel26.add(panel27, new GridConstraints(2, 0, 1, 4, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, null, null, 0, false));
+        qiniuSaveButton = new JButton();
+        qiniuSaveButton.setIcon(new ImageIcon(getClass().getResource("/icon/menu-saveall_dark.png")));
+        qiniuSaveButton.setText("保存");
+        panel27.add(qiniuSaveButton, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
         final Spacer spacer14 = new Spacer();
         panel27.add(spacer14, new GridConstraints(0, 1, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, 1, null, null, null, 0, false));
+        qiniuAccessKeyTextField = new JTextField();
+        panel26.add(qiniuAccessKeyTextField, new GridConstraints(0, 1, 1, 3, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, new Dimension(300, -1), new Dimension(300, -1), null, 0, false));
+        qiniuSecretKeyTextField = new JTextField();
+        panel26.add(qiniuSecretKeyTextField, new GridConstraints(1, 1, 1, 3, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, new Dimension(300, -1), new Dimension(300, -1), null, 0, false));
         final JPanel panel28 = new JPanel();
-        panel28.setLayout(new GridLayoutManager(8, 4, new Insets(15, 15, 10, 0), -1, -1));
-        panel3.add(panel28, new GridConstraints(12, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, null, null, 0, false));
-        panel28.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEmptyBorder(), "E-Mail", TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION, this.$$$getFont$$$(null, Font.BOLD, -1, panel28.getFont())));
-        final JLabel label40 = new JLabel();
-        label40.setText("邮件服务器的SMTP地址");
-        panel28.add(label40, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
+        panel28.setLayout(new GridLayoutManager(2, 4, new Insets(15, 15, 10, 0), -1, -1));
+        panel3.add(panel28, new GridConstraints(11, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, null, null, 0, false));
+        panel28.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEmptyBorder(), "云片网短信", TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION, this.$$$getFont$$$(null, Font.BOLD, -1, panel28.getFont())));
         final JLabel label41 = new JLabel();
-        label41.setText("邮件服务器的SMTP端口");
-        panel28.add(label41, new GridConstraints(1, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
+        label41.setText("ApiKey");
+        panel28.add(label41, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
+        yunpianApiKeyTextField = new JPasswordField();
+        yunpianApiKeyTextField.setText("");
+        panel28.add(yunpianApiKeyTextField, new GridConstraints(0, 1, 1, 3, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, new Dimension(300, -1), new Dimension(300, -1), null, 0, false));
+        final JPanel panel29 = new JPanel();
+        panel29.setLayout(new GridLayoutManager(1, 2, new Insets(0, 0, 0, 0), -1, -1));
+        panel28.add(panel29, new GridConstraints(1, 0, 1, 4, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, null, null, 0, false));
+        settingYunpianSaveButton = new JButton();
+        settingYunpianSaveButton.setIcon(new ImageIcon(getClass().getResource("/icon/menu-saveall_dark.png")));
+        settingYunpianSaveButton.setText("保存");
+        panel29.add(settingYunpianSaveButton, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
+        final Spacer spacer15 = new Spacer();
+        panel29.add(spacer15, new GridConstraints(0, 1, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, 1, null, null, null, 0, false));
+        final JPanel panel30 = new JPanel();
+        panel30.setLayout(new GridLayoutManager(8, 4, new Insets(15, 15, 10, 0), -1, -1));
+        panel3.add(panel30, new GridConstraints(13, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, null, null, 0, false));
+        panel30.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEmptyBorder(), "E-Mail", TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION, this.$$$getFont$$$(null, Font.BOLD, -1, panel30.getFont())));
         final JLabel label42 = new JLabel();
-        label42.setText("发件人(邮箱地址)");
-        panel28.add(label42, new GridConstraints(2, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
+        label42.setText("邮件服务器的SMTP地址");
+        panel30.add(label42, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
         final JLabel label43 = new JLabel();
-        label43.setText("用户名");
-        label43.setToolTipText("如果使用foxmail邮箱,此处为qq号");
-        panel28.add(label43, new GridConstraints(3, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
+        label43.setText("邮件服务器的SMTP端口");
+        panel30.add(label43, new GridConstraints(1, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
         final JLabel label44 = new JLabel();
-        label44.setText("密码");
-        panel28.add(label44, new GridConstraints(4, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
-        final JPanel panel29 = new JPanel();
-        panel29.setLayout(new GridLayoutManager(1, 3, new Insets(0, 0, 0, 0), -1, -1));
-        panel28.add(panel29, new GridConstraints(7, 0, 1, 4, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, null, null, 0, false));
+        label44.setText("发件人(邮箱地址)");
+        panel30.add(label44, new GridConstraints(2, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
+        final JLabel label45 = new JLabel();
+        label45.setText("用户名");
+        label45.setToolTipText("如果使用foxmail邮箱,此处为qq号");
+        panel30.add(label45, new GridConstraints(3, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
+        final JLabel label46 = new JLabel();
+        label46.setText("密码");
+        panel30.add(label46, new GridConstraints(4, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
+        final JPanel panel31 = new JPanel();
+        panel31.setLayout(new GridLayoutManager(1, 3, new Insets(0, 0, 0, 0), -1, -1));
+        panel30.add(panel31, new GridConstraints(7, 0, 1, 4, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, null, null, 0, false));
         saveMailButton = new JButton();
         saveMailButton.setIcon(new ImageIcon(getClass().getResource("/icon/menu-saveall_dark.png")));
         saveMailButton.setText("保存");
-        panel29.add(saveMailButton, new GridConstraints(0, 1, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
-        final Spacer spacer15 = new Spacer();
-        panel29.add(spacer15, new GridConstraints(0, 2, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, 1, null, null, null, 0, false));
+        panel31.add(saveMailButton, new GridConstraints(0, 1, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
+        final Spacer spacer16 = new Spacer();
+        panel31.add(spacer16, new GridConstraints(0, 2, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, 1, null, null, null, 0, false));
         testMailButton = new JButton();
         testMailButton.setIcon(new ImageIcon(getClass().getResource("/icon/arrow_right.png")));
         testMailButton.setText("测试");
-        panel29.add(testMailButton, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
+        panel31.add(testMailButton, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
         mailStartTLSCheckBox = new JCheckBox();
         mailStartTLSCheckBox.setText("使用STARTTLS安全连接");
-        panel28.add(mailStartTLSCheckBox, new GridConstraints(5, 0, 1, 4, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
+        panel30.add(mailStartTLSCheckBox, new GridConstraints(5, 0, 1, 4, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
         mailSSLCheckBox = new JCheckBox();
         mailSSLCheckBox.setText("使用SSL安全连接");
-        panel28.add(mailSSLCheckBox, new GridConstraints(6, 0, 1, 4, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
+        panel30.add(mailSSLCheckBox, new GridConstraints(6, 0, 1, 4, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
         mailHostTextField = new JTextField();
-        panel28.add(mailHostTextField, new GridConstraints(0, 1, 1, 3, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_FIXED, null, new Dimension(150, -1), null, 0, false));
+        panel30.add(mailHostTextField, new GridConstraints(0, 1, 1, 3, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_FIXED, null, new Dimension(150, -1), null, 0, false));
         mailPortTextField = new JTextField();
-        panel28.add(mailPortTextField, new GridConstraints(1, 1, 1, 3, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_FIXED, null, new Dimension(150, -1), null, 0, false));
+        panel30.add(mailPortTextField, new GridConstraints(1, 1, 1, 3, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_FIXED, null, new Dimension(150, -1), null, 0, false));
         mailFromTextField = new JTextField();
-        panel28.add(mailFromTextField, new GridConstraints(2, 1, 1, 3, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_FIXED, null, new Dimension(150, -1), null, 0, false));
+        panel30.add(mailFromTextField, new GridConstraints(2, 1, 1, 3, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_FIXED, null, new Dimension(150, -1), null, 0, false));
         mailUserTextField = new JTextField();
-        panel28.add(mailUserTextField, new GridConstraints(3, 1, 1, 3, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_FIXED, null, new Dimension(150, -1), null, 0, false));
+        panel30.add(mailUserTextField, new GridConstraints(3, 1, 1, 3, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_FIXED, null, new Dimension(150, -1), null, 0, false));
         mailPasswordField = new JPasswordField();
-        panel28.add(mailPasswordField, new GridConstraints(4, 1, 1, 3, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_FIXED, null, new Dimension(150, -1), null, 0, false));
-        final JPanel panel30 = new JPanel();
-        panel30.setLayout(new GridLayoutManager(4, 4, new Insets(15, 15, 10, 0), -1, -1));
-        panel3.add(panel30, new GridConstraints(13, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, null, null, 0, false));
-        panel30.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEmptyBorder(), "MySQL数据库", TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION, this.$$$getFont$$$(null, Font.BOLD, -1, panel30.getFont())));
-        final JLabel label45 = new JLabel();
-        label45.setText("数据库地址");
-        panel30.add(label45, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
+        panel30.add(mailPasswordField, new GridConstraints(4, 1, 1, 3, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_FIXED, null, new Dimension(150, -1), null, 0, false));
+        final JPanel panel32 = new JPanel();
+        panel32.setLayout(new GridLayoutManager(4, 4, new Insets(15, 15, 10, 0), -1, -1));
+        panel3.add(panel32, new GridConstraints(14, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, null, null, 0, false));
+        panel32.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEmptyBorder(), "MySQL数据库", TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION, this.$$$getFont$$$(null, Font.BOLD, -1, panel32.getFont())));
+        final JLabel label47 = new JLabel();
+        label47.setText("数据库地址");
+        panel32.add(label47, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
         mysqlUrlTextField = new JTextField();
-        panel30.add(mysqlUrlTextField, new GridConstraints(0, 1, 1, 3, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, new Dimension(300, -1), new Dimension(300, -1), null, 0, false));
-        final JLabel label46 = new JLabel();
-        label46.setText("用户名");
-        panel30.add(label46, new GridConstraints(1, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
+        panel32.add(mysqlUrlTextField, new GridConstraints(0, 1, 1, 3, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, new Dimension(300, -1), new Dimension(300, -1), null, 0, false));
+        final JLabel label48 = new JLabel();
+        label48.setText("用户名");
+        panel32.add(label48, new GridConstraints(1, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
         mysqlUserTextField = new JTextField();
-        panel30.add(mysqlUserTextField, new GridConstraints(1, 1, 1, 3, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, new Dimension(150, -1), null, 0, false));
-        final JLabel label47 = new JLabel();
-        label47.setText("密码");
-        panel30.add(label47, new GridConstraints(2, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
+        panel32.add(mysqlUserTextField, new GridConstraints(1, 1, 1, 3, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, new Dimension(150, -1), null, 0, false));
+        final JLabel label49 = new JLabel();
+        label49.setText("密码");
+        panel32.add(label49, new GridConstraints(2, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
         mysqlPasswordField = new JPasswordField();
-        panel30.add(mysqlPasswordField, new GridConstraints(2, 1, 1, 3, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, new Dimension(150, -1), null, 0, false));
-        final JPanel panel31 = new JPanel();
-        panel31.setLayout(new GridLayoutManager(2, 3, new Insets(0, 0, 0, 0), -1, -1));
-        panel30.add(panel31, new GridConstraints(3, 0, 1, 4, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, null, null, 0, false));
+        panel32.add(mysqlPasswordField, new GridConstraints(2, 1, 1, 3, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, new Dimension(150, -1), null, 0, false));
+        final JPanel panel33 = new JPanel();
+        panel33.setLayout(new GridLayoutManager(2, 3, new Insets(0, 0, 0, 0), -1, -1));
+        panel32.add(panel33, new GridConstraints(3, 0, 1, 4, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, null, null, 0, false));
         settingTestDbLinkButton = new JButton();
         settingTestDbLinkButton.setIcon(new ImageIcon(getClass().getResource("/icon/arrow_right.png")));
         settingTestDbLinkButton.setText("测试连接");
-        panel31.add(settingTestDbLinkButton, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
-        final Spacer spacer16 = new Spacer();
-        panel31.add(spacer16, new GridConstraints(0, 2, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, 1, null, null, null, 0, false));
+        panel33.add(settingTestDbLinkButton, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
+        final Spacer spacer17 = new Spacer();
+        panel33.add(spacer17, new GridConstraints(0, 2, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, 1, null, null, null, 0, false));
         settingDbInfoSaveButton = new JButton();
         settingDbInfoSaveButton.setIcon(new ImageIcon(getClass().getResource("/icon/menu-saveall_dark.png")));
         settingDbInfoSaveButton.setText("保存");
-        panel31.add(settingDbInfoSaveButton, new GridConstraints(0, 1, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
-        final JPanel panel32 = new JPanel();
-        panel32.setLayout(new GridLayoutManager(4, 3, new Insets(15, 15, 10, 0), -1, -1));
-        panel3.add(panel32, new GridConstraints(14, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, null, null, 0, false));
-        panel32.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEmptyBorder(), "外观", TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION, this.$$$getFont$$$(null, Font.BOLD, -1, panel32.getFont())));
-        final JLabel label48 = new JLabel();
-        label48.setText("主题风格");
-        panel32.add(label48, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
+        panel33.add(settingDbInfoSaveButton, new GridConstraints(0, 1, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
+        final JPanel panel34 = new JPanel();
+        panel34.setLayout(new GridLayoutManager(4, 3, new Insets(15, 15, 10, 0), -1, -1));
+        panel3.add(panel34, new GridConstraints(15, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, null, null, 0, false));
+        panel34.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEmptyBorder(), "外观", TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION, this.$$$getFont$$$(null, Font.BOLD, -1, panel34.getFont())));
+        final JLabel label50 = new JLabel();
+        label50.setText("主题风格");
+        panel34.add(label50, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
         settingThemeComboBox = new JComboBox();
         final DefaultComboBoxModel defaultComboBoxModel1 = new DefaultComboBoxModel();
         defaultComboBoxModel1.addElement("Darcula(推荐)");
         defaultComboBoxModel1.addElement("BeautyEye");
         defaultComboBoxModel1.addElement("系统默认");
         settingThemeComboBox.setModel(defaultComboBoxModel1);
-        panel32.add(settingThemeComboBox, new GridConstraints(0, 1, 1, 2, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, new Dimension(300, -1), new Dimension(300, -1), null, 0, false));
-        final JLabel label49 = new JLabel();
-        label49.setText("字体");
-        panel32.add(label49, new GridConstraints(1, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
+        panel34.add(settingThemeComboBox, new GridConstraints(0, 1, 1, 2, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, new Dimension(300, -1), new Dimension(300, -1), null, 0, false));
+        final JLabel label51 = new JLabel();
+        label51.setText("字体");
+        panel34.add(label51, new GridConstraints(1, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
         settingFontNameComboBox = new JComboBox();
         final DefaultComboBoxModel defaultComboBoxModel2 = new DefaultComboBoxModel();
         defaultComboBoxModel2.addElement("Microsoft YaHei");
@@ -897,10 +927,10 @@ public static void toggleMpOutSideAccessTokenPanel() {
         defaultComboBoxModel2.addElement("Microsoft YaHei UI");
         defaultComboBoxModel2.addElement("Microsoft YaHei UI Light");
         settingFontNameComboBox.setModel(defaultComboBoxModel2);
-        panel32.add(settingFontNameComboBox, new GridConstraints(1, 1, 1, 2, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
-        final JLabel label50 = new JLabel();
-        label50.setText("字号");
-        panel32.add(label50, new GridConstraints(2, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
+        panel34.add(settingFontNameComboBox, new GridConstraints(1, 1, 1, 2, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
+        final JLabel label52 = new JLabel();
+        label52.setText("字号");
+        panel34.add(label52, new GridConstraints(2, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
         settingFontSizeComboBox = new JComboBox();
         final DefaultComboBoxModel defaultComboBoxModel3 = new DefaultComboBoxModel();
         defaultComboBoxModel3.addElement("5");
@@ -926,51 +956,51 @@ public static void toggleMpOutSideAccessTokenPanel() {
         defaultComboBoxModel3.addElement("25");
         defaultComboBoxModel3.addElement("26");
         settingFontSizeComboBox.setModel(defaultComboBoxModel3);
-        panel32.add(settingFontSizeComboBox, new GridConstraints(2, 1, 1, 2, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
-        final JPanel panel33 = new JPanel();
-        panel33.setLayout(new GridLayoutManager(1, 2, new Insets(0, 0, 0, 0), -1, -1));
-        panel32.add(panel33, new GridConstraints(3, 0, 1, 3, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, null, null, 0, false));
+        panel34.add(settingFontSizeComboBox, new GridConstraints(2, 1, 1, 2, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
+        final JPanel panel35 = new JPanel();
+        panel35.setLayout(new GridLayoutManager(1, 2, new Insets(0, 0, 0, 0), -1, -1));
+        panel34.add(panel35, new GridConstraints(3, 0, 1, 3, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, null, null, 0, false));
         settingAppearanceSaveButton = new JButton();
         settingAppearanceSaveButton.setIcon(new ImageIcon(getClass().getResource("/icon/menu-saveall_dark.png")));
         settingAppearanceSaveButton.setText("保存");
-        panel33.add(settingAppearanceSaveButton, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
-        final Spacer spacer17 = new Spacer();
-        panel33.add(spacer17, new GridConstraints(0, 1, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, 1, null, null, null, 0, false));
-        final JPanel panel34 = new JPanel();
-        panel34.setLayout(new GridLayoutManager(3, 3, new Insets(15, 15, 10, 0), -1, -1));
-        Font panel34Font = this.$$$getFont$$$("Microsoft YaHei UI", -1, -1, panel34.getFont());
-        if (panel34Font != null) panel34.setFont(panel34Font);
-        panel3.add(panel34, new GridConstraints(11, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, null, null, 0, false));
-        panel34.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEmptyBorder(), "HTTP请求", TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION, this.$$$getFont$$$(null, Font.BOLD, -1, panel34.getFont())));
-        final JPanel panel35 = new JPanel();
-        panel35.setLayout(new GridLayoutManager(1, 2, new Insets(0, 0, 0, 0), -1, -1));
-        panel34.add(panel35, new GridConstraints(2, 0, 1, 3, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, null, null, 0, false));
+        panel35.add(settingAppearanceSaveButton, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
+        final Spacer spacer18 = new Spacer();
+        panel35.add(spacer18, new GridConstraints(0, 1, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, 1, null, null, null, 0, false));
+        final JPanel panel36 = new JPanel();
+        panel36.setLayout(new GridLayoutManager(3, 3, new Insets(15, 15, 10, 0), -1, -1));
+        Font panel36Font = this.$$$getFont$$$("Microsoft YaHei UI", -1, -1, panel36.getFont());
+        if (panel36Font != null) panel36.setFont(panel36Font);
+        panel3.add(panel36, new GridConstraints(12, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, null, null, 0, false));
+        panel36.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEmptyBorder(), "HTTP请求", TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION, this.$$$getFont$$$(null, Font.BOLD, -1, panel36.getFont())));
+        final JPanel panel37 = new JPanel();
+        panel37.setLayout(new GridLayoutManager(1, 2, new Insets(0, 0, 0, 0), -1, -1));
+        panel36.add(panel37, new GridConstraints(2, 0, 1, 3, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, null, null, 0, false));
         httpSaveButton = new JButton();
         httpSaveButton.setIcon(new ImageIcon(getClass().getResource("/icon/menu-saveall_dark.png")));
         httpSaveButton.setText("保存");
-        panel35.add(httpSaveButton, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
-        final Spacer spacer18 = new Spacer();
-        panel35.add(spacer18, new GridConstraints(0, 1, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, 1, null, null, null, 0, false));
+        panel37.add(httpSaveButton, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
+        final Spacer spacer19 = new Spacer();
+        panel37.add(spacer19, new GridConstraints(0, 1, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, 1, null, null, null, 0, false));
         httpUseProxyCheckBox = new JCheckBox();
         httpUseProxyCheckBox.setText("使用HTTP代理");
-        panel34.add(httpUseProxyCheckBox, new GridConstraints(0, 0, 1, 3, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
+        panel36.add(httpUseProxyCheckBox, new GridConstraints(0, 0, 1, 3, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
         httpProxyPanel = new JPanel();
         httpProxyPanel.setLayout(new GridLayoutManager(4, 2, new Insets(0, 26, 0, 0), -1, -1));
-        panel34.add(httpProxyPanel, new GridConstraints(1, 0, 1, 3, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, null, null, 0, false));
-        final JLabel label51 = new JLabel();
-        label51.setText("Host");
-        httpProxyPanel.add(label51, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
+        panel36.add(httpProxyPanel, new GridConstraints(1, 0, 1, 3, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, null, null, 0, false));
+        final JLabel label53 = new JLabel();
+        label53.setText("Host");
+        httpProxyPanel.add(label53, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
         httpProxyHostTextField = new JTextField();
         httpProxyPanel.add(httpProxyHostTextField, new GridConstraints(0, 1, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_FIXED, null, new Dimension(150, -1), null, 0, false));
-        final JLabel label52 = new JLabel();
-        label52.setText("端口");
-        httpProxyPanel.add(label52, new GridConstraints(1, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
-        final JLabel label53 = new JLabel();
-        label53.setText("用户名");
-        httpProxyPanel.add(label53, new GridConstraints(2, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
         final JLabel label54 = new JLabel();
-        label54.setText("密码");
-        httpProxyPanel.add(label54, new GridConstraints(3, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
+        label54.setText("端口");
+        httpProxyPanel.add(label54, new GridConstraints(1, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
+        final JLabel label55 = new JLabel();
+        label55.setText("用户名");
+        httpProxyPanel.add(label55, new GridConstraints(2, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
+        final JLabel label56 = new JLabel();
+        label56.setText("密码");
+        httpProxyPanel.add(label56, new GridConstraints(3, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
         httpProxyPortTextField = new JTextField();
         httpProxyPanel.add(httpProxyPortTextField, new GridConstraints(1, 1, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_FIXED, null, new Dimension(150, -1), null, 0, false));
         httpProxyUserTextField = new JTextField();
diff --git a/src/main/java/com/fangxuele/tool/push/ui/listener/SettingListener.java b/src/main/java/com/fangxuele/tool/push/ui/listener/SettingListener.java
index 4c6d85ba..df60ae27 100644
--- a/src/main/java/com/fangxuele/tool/push/ui/listener/SettingListener.java
+++ b/src/main/java/com/fangxuele/tool/push/ui/listener/SettingListener.java
@@ -352,6 +352,24 @@ public static void addListeners() {
             }
         });
 
+        // 设置-七牛云短信-保存
+        settingForm.getQiniuSaveButton().addActionListener(e -> {
+            try {
+                App.config.setQiniuAccessKey(settingForm.getQiniuAccessKeyTextField().getText());
+                App.config.setQiniuSecretKey(settingForm.getQiniuSecretKeyTextField().getText());
+                App.config.save();
+
+//              TODO  HttpMsgSender.okHttpClient = null;
+
+                JOptionPane.showMessageDialog(settingPanel, "保存成功!", "成功",
+                        JOptionPane.INFORMATION_MESSAGE);
+            } catch (Exception e1) {
+                JOptionPane.showMessageDialog(settingPanel, "保存失败!\n\n" + e1.getMessage(), "失败",
+                        JOptionPane.ERROR_MESSAGE);
+                logger.error(e1);
+            }
+        });
+
         // 设置-云片网短信-保存
         settingForm.getSettingYunpianSaveButton().addActionListener(e -> {
             try {
diff --git a/src/main/java/com/fangxuele/tool/push/util/ConfigUtil.java b/src/main/java/com/fangxuele/tool/push/util/ConfigUtil.java
index d2e62117..beb7377c 100644
--- a/src/main/java/com/fangxuele/tool/push/util/ConfigUtil.java
+++ b/src/main/java/com/fangxuele/tool/push/util/ConfigUtil.java
@@ -154,6 +154,9 @@ private ConfigUtil() {
 
     private String upAuthorizationToken;
 
+    private String qiniuAccessKey;
+    private String qiniuSecretKey;
+
     private String yunpianApiKey;
 
     private boolean httpUseProxy;
@@ -874,6 +877,22 @@ public void setUpAuthorizationToken(String upAuthorizationToken) {
         setting.put("setting.upyun", "upAuthorizationToken", upAuthorizationToken);
     }
 
+    public String getQiniuAccessKey() {
+        return setting.getStr("qiniuAccessKey", "setting.qiniu", "");
+    }
+
+    public void setQiniuAccessKey(String qiniuAccessKey) {
+        setting.put("setting.qiniu", "qiniuAccessKey", qiniuAccessKey);
+    }
+
+    public String getQiniuSecretKey() {
+        return setting.getStr("qiniuSecretKey", "setting.qiniu", "");
+    }
+
+    public void setQiniuSecretKey(String qiniuSecretKey) {
+        setting.put("setting.qiniu", "qiniuSecretKey", qiniuSecretKey);
+    }
+
     public String getYunpianApiKey() {
         return setting.getStr("apiKey", "setting.yunpian", "");
     }

From af57e485f43b1717ad2ac5267aba553726394021 Mon Sep 17 00:00:00 2001
From: sunsence 
Date: Sun, 15 Sep 2019 21:42:52 +0800
Subject: [PATCH 06/16] =?UTF-8?q?feature:=E5=A2=9E=E5=8A=A0=E5=AF=B9?=
 =?UTF-8?q?=E4=B8=83=E7=89=9B=E4=BA=91=E7=9F=AD=E4=BF=A1=E7=9A=84=E6=94=AF?=
 =?UTF-8?q?=E6=8C=81=EF=BC=88=E7=AC=AC=E4=B8=89=E6=AD=A5=EF=BC=9A=E5=A2=9E?=
 =?UTF-8?q?=E5=8A=A0=E6=B5=81=E7=A8=8B=EF=BC=89?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../tool/push/logic/MessageTypeEnum.java      |   7 +-
 .../tool/push/logic/PushControl.java          |  11 +
 .../push/logic/msgmaker/MsgMakerFactory.java  |   3 +
 .../push/logic/msgmaker/QiNiuYunMsgMaker.java |  61 ++++
 .../logic/msgsender/MsgSenderFactory.java     |   3 +
 .../logic/msgsender/QiNiuYunMsgSender.java    |  86 +++++
 .../tool/push/ui/form/MessageEditForm.java    |   3 +
 .../tool/push/ui/form/MessageTypeForm.form    |  20 +-
 .../tool/push/ui/form/MessageTypeForm.java    |  15 +-
 .../tool/push/ui/form/msg/MsgFormFactory.java |   3 +
 .../push/ui/form/msg/QiNiuYunMsgForm.form     | 121 +++++++
 .../push/ui/form/msg/QiNiuYunMsgForm.java     | 315 ++++++++++++++++++
 .../push/ui/listener/MessageTypeListener.java |   4 +
 .../push/ui/listener/MsgEditListener.java     |   3 +-
 14 files changed, 637 insertions(+), 18 deletions(-)
 create mode 100644 src/main/java/com/fangxuele/tool/push/logic/msgmaker/QiNiuYunMsgMaker.java
 create mode 100644 src/main/java/com/fangxuele/tool/push/logic/msgsender/QiNiuYunMsgSender.java
 create mode 100644 src/main/java/com/fangxuele/tool/push/ui/form/msg/QiNiuYunMsgForm.form
 create mode 100644 src/main/java/com/fangxuele/tool/push/ui/form/msg/QiNiuYunMsgForm.java

diff --git a/src/main/java/com/fangxuele/tool/push/logic/MessageTypeEnum.java b/src/main/java/com/fangxuele/tool/push/logic/MessageTypeEnum.java
index a89405e2..c23c4a6a 100644
--- a/src/main/java/com/fangxuele/tool/push/logic/MessageTypeEnum.java
+++ b/src/main/java/com/fangxuele/tool/push/logic/MessageTypeEnum.java
@@ -25,7 +25,8 @@ public enum MessageTypeEnum {
     WX_CP(12, "微信企业号/企业微信"),
     HTTP(13, "HTTP请求"),
     DING(14, "钉钉"),
-    BD_YUN(15, "百度云短信");
+    BD_YUN(15, "百度云短信"),
+    QI_NIU_YUN(16, "七牛云短信");
 
     private int code;
 
@@ -45,6 +46,7 @@ public enum MessageTypeEnum {
     public static final int HTTP_CODE = 13;
     public static final int DING_CODE = 14;
     public static final int BD_YUN_CODE = 15;
+    public static final int QI_NIU_YUN_CODE = 16;
 
     MessageTypeEnum(int code, String name) {
         this.code = code;
@@ -96,6 +98,9 @@ public static String getName(int code) {
             case 15:
                 name = BD_YUN.name;
                 break;
+            case 16:
+                name = QI_NIU_YUN.name;
+                break;
             default:
                 name = "";
         }
diff --git a/src/main/java/com/fangxuele/tool/push/logic/PushControl.java b/src/main/java/com/fangxuele/tool/push/logic/PushControl.java
index 7110b679..8eeb2ffb 100644
--- a/src/main/java/com/fangxuele/tool/push/logic/PushControl.java
+++ b/src/main/java/com/fangxuele/tool/push/logic/PushControl.java
@@ -186,6 +186,17 @@ public static boolean configCheck() {
                     return false;
                 }
                 break;
+            case MessageTypeEnum.QI_NIU_YUN_CODE:
+                String qiniuAccessKey = App.config.getQiniuAccessKey();
+                String qiniuSecretKey = App.config.getQiniuSecretKey();
+
+                if (StringUtils.isEmpty(qiniuAccessKey) || StringUtils.isEmpty(qiniuSecretKey)) {
+                    JOptionPane.showMessageDialog(settingForm.getSettingPanel(),
+                            "请先在设置中填写并保存七牛云短信相关配置!", "提示",
+                            JOptionPane.INFORMATION_MESSAGE);
+                    return false;
+                }
+                break;
             case MessageTypeEnum.UP_YUN_CODE:
                 String upAuthorizationToken = App.config.getUpAuthorizationToken();
 
diff --git a/src/main/java/com/fangxuele/tool/push/logic/msgmaker/MsgMakerFactory.java b/src/main/java/com/fangxuele/tool/push/logic/msgmaker/MsgMakerFactory.java
index f312fccb..991f9872 100644
--- a/src/main/java/com/fangxuele/tool/push/logic/msgmaker/MsgMakerFactory.java
+++ b/src/main/java/com/fangxuele/tool/push/logic/msgmaker/MsgMakerFactory.java
@@ -60,6 +60,9 @@ public static IMsgMaker getMsgMaker() {
             case MessageTypeEnum.UP_YUN_CODE:
                 iMsgMaker = new UpYunMsgMaker();
                 break;
+            case MessageTypeEnum.QI_NIU_YUN_CODE:
+                iMsgMaker = new QiNiuYunMsgMaker();
+                break;
             default:
         }
         return iMsgMaker;
diff --git a/src/main/java/com/fangxuele/tool/push/logic/msgmaker/QiNiuYunMsgMaker.java b/src/main/java/com/fangxuele/tool/push/logic/msgmaker/QiNiuYunMsgMaker.java
new file mode 100644
index 00000000..3449e3d7
--- /dev/null
+++ b/src/main/java/com/fangxuele/tool/push/logic/msgmaker/QiNiuYunMsgMaker.java
@@ -0,0 +1,61 @@
+package com.fangxuele.tool.push.logic.msgmaker;
+
+import com.fangxuele.tool.push.ui.form.msg.QiNiuYunMsgForm;
+import com.fangxuele.tool.push.util.TemplateUtil;
+import org.apache.commons.compress.utils.Lists;
+import org.apache.velocity.VelocityContext;
+
+import javax.swing.table.DefaultTableModel;
+import java.util.List;
+
+/**
+ * 
+ * 七牛云模板短信加工器
+ * 
+ * + * @author Zhou Bo + * @since 2019/6/14. + */ +public class QiNiuYunMsgMaker extends BaseMsgMaker implements IMsgMaker{ + + public static int templateId; + + public static List paramList; + + /** + * 准备(界面字段等) + */ + @Override + public void prepare() { + templateId = Integer.parseInt(QiNiuYunMsgForm.getInstance().getMsgTemplateIdTextField().getText()); + + if (QiNiuYunMsgForm.getInstance().getTemplateMsgDataTable().getModel().getRowCount() == 0) { + QiNiuYunMsgForm.initTemplateDataTable(); + } + + DefaultTableModel tableModel = (DefaultTableModel) QiNiuYunMsgForm.getInstance().getTemplateMsgDataTable().getModel(); + int rowCount = tableModel.getRowCount(); + paramList = Lists.newArrayList(); + for (int i = 0; i < rowCount; i++) { + String value = ((String) tableModel.getValueAt(i, 1)); + paramList.add(value); + } + } + + /** + * 组织七牛云短信消息 + * + * @param msgData 消息信息 + * @return String[] + */ + @Override + public String[] makeMsg(String[] msgData) { + + VelocityContext velocityContext = getVelocityContext(msgData); + for (int i = 0; i < paramList.size(); i++) { + paramList.set(i, TemplateUtil.evaluate(paramList.get(i), velocityContext)); + } + String[] paramArray = new String[paramList.size()]; + return paramList.toArray(paramArray); + } +} diff --git a/src/main/java/com/fangxuele/tool/push/logic/msgsender/MsgSenderFactory.java b/src/main/java/com/fangxuele/tool/push/logic/msgsender/MsgSenderFactory.java index 51465d85..631aa88a 100644 --- a/src/main/java/com/fangxuele/tool/push/logic/msgsender/MsgSenderFactory.java +++ b/src/main/java/com/fangxuele/tool/push/logic/msgsender/MsgSenderFactory.java @@ -63,6 +63,9 @@ public static IMsgSender getMsgSender() { case MessageTypeEnum.UP_YUN_CODE: iMsgSender = new UpYunMsgSender(); break; + case MessageTypeEnum.QI_NIU_YUN_CODE: + iMsgSender = new QiNiuYunMsgSender(); + break; default: break; } diff --git a/src/main/java/com/fangxuele/tool/push/logic/msgsender/QiNiuYunMsgSender.java b/src/main/java/com/fangxuele/tool/push/logic/msgsender/QiNiuYunMsgSender.java new file mode 100644 index 00000000..94e8c8d4 --- /dev/null +++ b/src/main/java/com/fangxuele/tool/push/logic/msgsender/QiNiuYunMsgSender.java @@ -0,0 +1,86 @@ +package com.fangxuele.tool.push.logic.msgsender; + +import com.fangxuele.tool.push.App; +import com.fangxuele.tool.push.logic.PushControl; +import com.fangxuele.tool.push.logic.msgmaker.QiNiuYunMsgMaker; +import com.github.qcloudsms.SmsSingleSender; +import com.github.qcloudsms.SmsSingleSenderResult; +import lombok.extern.slf4j.Slf4j; + +/** + *
+ * 七牛云模板短信发送器
+ * 
+ * + * @author RememBerBer + * @since 2019/6/15. + */ +@Slf4j +public class QiNiuYunMsgSender implements IMsgSender { + /** + * 七牛云短信sender + */ + public volatile static SmsSingleSender smsSingleSender; + + private QiNiuYunMsgMaker qiNiuYunMsgMaker; + + public QiNiuYunMsgSender() { + qiNiuYunMsgMaker = new QiNiuYunMsgMaker(); + smsSingleSender = getTxYunSender(); + } + + @Override + public SendResult send(String[] msgData) { + SendResult sendResult = new SendResult(); + try { + int templateId = QiNiuYunMsgMaker.templateId; + String smsSign = App.config.getTxyunSign(); + String[] params = qiNiuYunMsgMaker.makeMsg(msgData); + String telNum = msgData[0]; + if (PushControl.dryRun) { + sendResult.setSuccess(true); + return sendResult; + } else { + SmsSingleSenderResult result = smsSingleSender.sendWithParam("86", telNum, + templateId, params, smsSign, "", ""); + + if (result.result == 0) { + sendResult.setSuccess(true); + } else { + sendResult.setSuccess(false); + sendResult.setInfo(result.toString()); + } + } + } catch (Exception e) { + sendResult.setSuccess(false); + sendResult.setInfo(e.getMessage()); + log.error(e.toString()); + } + + return sendResult; + } + + @Override + public SendResult asyncSend(String[] msgData) { + return null; + } + + /** + * 获取七牛云短信发送客户端 + * + * @return SmsSingleSender + */ + private static SmsSingleSender getTxYunSender() { + if (smsSingleSender == null) { + synchronized (QiNiuYunMsgSender.class) { + if (smsSingleSender == null) { + String txyunAppId = App.config.getTxyunAppId(); + String txyunAppKey = App.config.getTxyunAppKey(); + + smsSingleSender = new SmsSingleSender(Integer.parseInt(txyunAppId), txyunAppKey); + } + } + } + return smsSingleSender; + } +} diff --git a/src/main/java/com/fangxuele/tool/push/ui/form/MessageEditForm.java b/src/main/java/com/fangxuele/tool/push/ui/form/MessageEditForm.java index 07c7a777..35225bef 100644 --- a/src/main/java/com/fangxuele/tool/push/ui/form/MessageEditForm.java +++ b/src/main/java/com/fangxuele/tool/push/ui/form/MessageEditForm.java @@ -102,6 +102,9 @@ public static void switchMsgType(int msgType) { case MessageTypeEnum.TX_YUN_CODE: messageEditForm.getMsgEditorPanel().add(TxYunMsgForm.getInstance().getTemplateMsgPanel(), gridConstraintsRow0); break; + case MessageTypeEnum.QI_NIU_YUN_CODE: + messageEditForm.getMsgEditorPanel().add(QiNiuYunMsgForm.getInstance().getTemplateMsgPanel(), gridConstraintsRow0); + break; case MessageTypeEnum.UP_YUN_CODE: messageEditForm.getMsgEditorPanel().add(UpYunMsgForm.getInstance().getTemplateMsgPanel(), gridConstraintsRow0); break; diff --git a/src/main/java/com/fangxuele/tool/push/ui/form/MessageTypeForm.form b/src/main/java/com/fangxuele/tool/push/ui/form/MessageTypeForm.form index 49d35a90..4682cb5b 100644 --- a/src/main/java/com/fangxuele/tool/push/ui/form/MessageTypeForm.form +++ b/src/main/java/com/fangxuele/tool/push/ui/form/MessageTypeForm.form @@ -141,7 +141,7 @@ - + @@ -157,15 +157,6 @@ - - - - - - - - - @@ -216,6 +207,15 @@
+ + + + + + + + +
diff --git a/src/main/java/com/fangxuele/tool/push/ui/form/MessageTypeForm.java b/src/main/java/com/fangxuele/tool/push/ui/form/MessageTypeForm.java index a54ebe4a..9da976cb 100644 --- a/src/main/java/com/fangxuele/tool/push/ui/form/MessageTypeForm.java +++ b/src/main/java/com/fangxuele/tool/push/ui/form/MessageTypeForm.java @@ -42,7 +42,7 @@ public class MessageTypeForm { private JScrollPane messageTypeScrollPane; private JLabel kefuPriorityTipsLabel; private JRadioButton httpRadioButton; - private JRadioButton 七牛云短信RadioButton; + private JRadioButton qiniuRadioButton; private JRadioButton bdYunRadioButton; private static MessageTypeForm messageTypeForm; @@ -88,6 +88,9 @@ public static void init() { case MessageTypeEnum.TX_YUN_CODE: messageTypeForm.getTxYunRadioButton().setSelected(true); break; + case MessageTypeEnum.QI_NIU_YUN_CODE: + messageTypeForm.getQiniuRadioButton().setSelected(true); + break; case MessageTypeEnum.YUN_PIAN_CODE: messageTypeForm.getYunPianRadioButton().setSelected(true); break; @@ -255,15 +258,11 @@ public static void clearAllSelected() { eMailRadioButton = new JRadioButton(); eMailRadioButton.setEnabled(true); eMailRadioButton.setText("E-Mail(BETA)"); - msgTypeListPanel.add(eMailRadioButton, new GridConstraints(13, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + msgTypeListPanel.add(eMailRadioButton, new GridConstraints(14, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); wxCpRadioButton = new JRadioButton(); wxCpRadioButton.setEnabled(true); wxCpRadioButton.setText("企业号/企业微信"); msgTypeListPanel.add(wxCpRadioButton, new GridConstraints(5, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); - 七牛云短信RadioButton = new JRadioButton(); - 七牛云短信RadioButton.setEnabled(false); - 七牛云短信RadioButton.setText("七牛云短信"); - msgTypeListPanel.add(七牛云短信RadioButton, new GridConstraints(14, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); httpRadioButton = new JRadioButton(); httpRadioButton.setEnabled(true); httpRadioButton.setText("HTTP请求"); @@ -286,6 +285,10 @@ public static void clearAllSelected() { upYunRadioButton.setEnabled(true); upYunRadioButton.setText("又拍云短信(BETA)"); msgTypeListPanel.add(upYunRadioButton, new GridConstraints(12, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + qiniuRadioButton = new JRadioButton(); + qiniuRadioButton.setEnabled(true); + qiniuRadioButton.setText("七牛云短信(BETA)"); + msgTypeListPanel.add(qiniuRadioButton, new GridConstraints(13, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); final JPanel panel1 = new JPanel(); panel1.setLayout(new GridLayoutManager(2, 1, new Insets(8, 8, 8, 0), -1, -1)); messageTypePanel.add(panel1, new GridConstraints(1, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, null, null, 0, false)); diff --git a/src/main/java/com/fangxuele/tool/push/ui/form/msg/MsgFormFactory.java b/src/main/java/com/fangxuele/tool/push/ui/form/msg/MsgFormFactory.java index 08ff5fee..72aea495 100644 --- a/src/main/java/com/fangxuele/tool/push/ui/form/msg/MsgFormFactory.java +++ b/src/main/java/com/fangxuele/tool/push/ui/form/msg/MsgFormFactory.java @@ -41,6 +41,9 @@ public static IMsgForm getMsgForm() { case MessageTypeEnum.TX_YUN_CODE: iMsgForm = TxYunMsgForm.getInstance(); break; + case MessageTypeEnum.QI_NIU_YUN_CODE: + iMsgForm = QiNiuYunMsgForm.getInstance(); + break; case MessageTypeEnum.UP_YUN_CODE: iMsgForm = UpYunMsgForm.getInstance(); break; diff --git a/src/main/java/com/fangxuele/tool/push/ui/form/msg/QiNiuYunMsgForm.form b/src/main/java/com/fangxuele/tool/push/ui/form/msg/QiNiuYunMsgForm.form new file mode 100644 index 00000000..2d883a1f --- /dev/null +++ b/src/main/java/com/fangxuele/tool/push/ui/form/msg/QiNiuYunMsgForm.form @@ -0,0 +1,121 @@ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/java/com/fangxuele/tool/push/ui/form/msg/QiNiuYunMsgForm.java b/src/main/java/com/fangxuele/tool/push/ui/form/msg/QiNiuYunMsgForm.java new file mode 100644 index 00000000..9a12296b --- /dev/null +++ b/src/main/java/com/fangxuele/tool/push/ui/form/msg/QiNiuYunMsgForm.java @@ -0,0 +1,315 @@ +package com.fangxuele.tool.push.ui.form.msg; + +import com.fangxuele.tool.push.dao.TMsgSmsMapper; +import com.fangxuele.tool.push.dao.TTemplateDataMapper; +import com.fangxuele.tool.push.domain.TMsgSms; +import com.fangxuele.tool.push.domain.TTemplateData; +import com.fangxuele.tool.push.logic.MessageTypeEnum; +import com.fangxuele.tool.push.ui.component.TableInCellButtonColumn; +import com.fangxuele.tool.push.ui.form.MainWindow; +import com.fangxuele.tool.push.ui.form.MessageEditForm; +import com.fangxuele.tool.push.util.MybatisUtil; +import com.fangxuele.tool.push.util.SqliteUtil; +import com.intellij.uiDesigner.core.GridConstraints; +import com.intellij.uiDesigner.core.GridLayoutManager; +import lombok.Getter; +import org.apache.commons.lang3.StringUtils; + +import javax.swing.*; +import javax.swing.border.TitledBorder; +import javax.swing.table.DefaultTableCellRenderer; +import javax.swing.table.DefaultTableModel; +import javax.swing.table.TableColumnModel; +import java.awt.*; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** + *
+ * QiNiuYunMsgForm
+ * 
+ * + * @author Zhou Bo + * @since 2019/6/3. + */ +@Getter +public class QiNiuYunMsgForm implements IMsgForm { + private JPanel templateMsgPanel; + private JLabel templateIdLabel; + private JTextField msgTemplateIdTextField; + private JPanel templateMsgDataPanel; + private JLabel templateMsgNameLabel; + private JTextField templateDataNameTextField; + private JLabel templateMsgValueLabel; + private JTextField templateDataValueTextField; + private JButton templateMsgDataAddButton; + private JTable templateMsgDataTable; + + private static QiNiuYunMsgForm qiNiuYunMsgForm; + + private static TMsgSmsMapper msgSmsMapper = MybatisUtil.getSqlSession().getMapper(TMsgSmsMapper.class); + private static TTemplateDataMapper templateDataMapper = MybatisUtil.getSqlSession().getMapper(TTemplateDataMapper.class); + + public QiNiuYunMsgForm() { + // 模板数据-添加 按钮事件 + templateMsgDataAddButton.addActionListener(e -> { + String[] data = new String[2]; + data[0] = getInstance().getTemplateDataNameTextField().getText(); + data[1] = getInstance().getTemplateDataValueTextField().getText(); + + if (getInstance().getTemplateMsgDataTable().getModel().getRowCount() == 0) { + initTemplateDataTable(); + } + + DefaultTableModel tableModel = (DefaultTableModel) getInstance().getTemplateMsgDataTable() + .getModel(); + int rowCount = tableModel.getRowCount(); + + Set keySet = new HashSet<>(); + String keyData; + for (int i = 0; i < rowCount; i++) { + keyData = (String) tableModel.getValueAt(i, 0); + keySet.add(keyData); + } + + if (StringUtils.isEmpty(data[0]) || StringUtils.isEmpty(data[1])) { + JOptionPane.showMessageDialog(MessageEditForm.getInstance().getMsgEditorPanel(), "模板参数和参数对应的值不能为空!", "提示", + JOptionPane.INFORMATION_MESSAGE); + } else if (keySet.contains(data[0])) { + JOptionPane.showMessageDialog(MessageEditForm.getInstance().getMsgEditorPanel(), "模板参数不能重复!", "提示", + JOptionPane.INFORMATION_MESSAGE); + } else { + tableModel.addRow(data); + } + }); + } + + @Override + public void init(String msgName) { + clearAllField(); + List tMsgSmsList = msgSmsMapper.selectByMsgTypeAndMsgName(MessageTypeEnum.QI_NIU_YUN_CODE, msgName); + Integer msgId = 0; + if (tMsgSmsList.size() > 0) { + TMsgSms tMsgSms = tMsgSmsList.get(0); + msgId = tMsgSms.getId(); + getInstance().getMsgTemplateIdTextField().setText(tMsgSms.getTemplateId()); + } + + initTemplateDataTable(); + // 模板消息Data表 + List templateDataList = templateDataMapper.selectByMsgTypeAndMsgId(MessageTypeEnum.QI_NIU_YUN_CODE, msgId); + String[] headerNames = {"模板参数", "参数对应的值", "操作"}; + Object[][] cellData = new String[templateDataList.size()][headerNames.length]; + for (int i = 0; i < templateDataList.size(); i++) { + TTemplateData tTemplateData = templateDataList.get(i); + cellData[i][0] = tTemplateData.getName(); + cellData[i][1] = tTemplateData.getValue(); + } + DefaultTableModel model = new DefaultTableModel(cellData, headerNames); + getInstance().getTemplateMsgDataTable().setModel(model); + TableColumnModel tableColumnModel = getInstance().getTemplateMsgDataTable().getColumnModel(); + tableColumnModel.getColumn(headerNames.length - 1). + setCellRenderer(new TableInCellButtonColumn(getInstance().getTemplateMsgDataTable(), headerNames.length - 1)); + tableColumnModel.getColumn(headerNames.length - 1). + setCellEditor(new TableInCellButtonColumn(getInstance().getTemplateMsgDataTable(), headerNames.length - 1)); + + // 设置列宽 + tableColumnModel.getColumn(2).setPreferredWidth(46); + tableColumnModel.getColumn(2).setMaxWidth(46); + } + + @Override + public void save(String msgName) { + int msgId = 0; + boolean existSameMsg = false; + + List tMsgSmsList = msgSmsMapper.selectByMsgTypeAndMsgName(MessageTypeEnum.QI_NIU_YUN_CODE, msgName); + if (tMsgSmsList.size() > 0) { + existSameMsg = true; + msgId = tMsgSmsList.get(0).getId(); + } + + int isCover = JOptionPane.NO_OPTION; + if (existSameMsg) { + // 如果存在,是否覆盖 + isCover = JOptionPane.showConfirmDialog(MainWindow.getInstance().getMessagePanel(), "已经存在同名的历史消息,\n是否覆盖?", "确认", + JOptionPane.YES_NO_OPTION); + } + + if (!existSameMsg || isCover == JOptionPane.YES_OPTION) { + String templateId = getInstance().getMsgTemplateIdTextField().getText(); + + String now = SqliteUtil.nowDateForSqlite(); + + TMsgSms tMsgSms = new TMsgSms(); + tMsgSms.setMsgType(MessageTypeEnum.QI_NIU_YUN_CODE); + tMsgSms.setMsgName(msgName); + tMsgSms.setTemplateId(templateId); + tMsgSms.setCreateTime(now); + tMsgSms.setModifiedTime(now); + + if (existSameMsg) { + msgSmsMapper.updateByMsgTypeAndMsgName(tMsgSms); + } else { + msgSmsMapper.insertSelective(tMsgSms); + msgId = tMsgSms.getId(); + } + + // 保存模板数据 + // 如果是覆盖保存,则先清空之前的模板数据 + if (existSameMsg) { + templateDataMapper.deleteByMsgTypeAndMsgId(MessageTypeEnum.QI_NIU_YUN_CODE, msgId); + } + + // 如果table为空,则初始化 + if (getInstance().getTemplateMsgDataTable().getModel().getRowCount() == 0) { + initTemplateDataTable(); + } + + // 逐行读取 + DefaultTableModel tableModel = (DefaultTableModel) getInstance().getTemplateMsgDataTable() + .getModel(); + int rowCount = tableModel.getRowCount(); + for (int i = 0; i < rowCount; i++) { + String name = (String) tableModel.getValueAt(i, 0); + String value = (String) tableModel.getValueAt(i, 1); + + TTemplateData tTemplateData = new TTemplateData(); + tTemplateData.setMsgType(MessageTypeEnum.QI_NIU_YUN_CODE); + tTemplateData.setMsgId(msgId); + tTemplateData.setName(name); + tTemplateData.setValue(value); + tTemplateData.setCreateTime(now); + tTemplateData.setModifiedTime(now); + + templateDataMapper.insert(tTemplateData); + } + + JOptionPane.showMessageDialog(MainWindow.getInstance().getMessagePanel(), "保存成功!", "成功", + JOptionPane.INFORMATION_MESSAGE); + } + + } + + public static QiNiuYunMsgForm getInstance() { + if (qiNiuYunMsgForm == null) { + qiNiuYunMsgForm = new QiNiuYunMsgForm(); + } + return qiNiuYunMsgForm; + } + + /** + * 初始化模板消息数据table + */ + public static void initTemplateDataTable() { + JTable msgDataTable = getInstance().getTemplateMsgDataTable(); + String[] headerNames = {"模板参数", "参数对应的值", "操作"}; + DefaultTableModel model = new DefaultTableModel(null, headerNames); + msgDataTable.setModel(model); + msgDataTable.updateUI(); + DefaultTableCellRenderer hr = (DefaultTableCellRenderer) msgDataTable.getTableHeader().getDefaultRenderer(); + // 表头列名居左 + hr.setHorizontalAlignment(DefaultTableCellRenderer.LEFT); + + TableColumnModel tableColumnModel = msgDataTable.getColumnModel(); + tableColumnModel.getColumn(headerNames.length - 1). + setCellRenderer(new TableInCellButtonColumn(msgDataTable, headerNames.length - 1)); + tableColumnModel.getColumn(headerNames.length - 1). + setCellEditor(new TableInCellButtonColumn(msgDataTable, headerNames.length - 1)); + + // 设置列宽 + tableColumnModel.getColumn(2).setPreferredWidth(46); + tableColumnModel.getColumn(2).setMaxWidth(46); + } + + /** + * 清空所有界面字段 + */ + public static void clearAllField() { + getInstance().getMsgTemplateIdTextField().setText(""); + getInstance().getTemplateDataNameTextField().setText(""); + getInstance().getTemplateDataValueTextField().setText(""); + initTemplateDataTable(); + } + + { +// GUI initializer generated by IntelliJ IDEA GUI Designer +// >>> IMPORTANT!! <<< +// DO NOT EDIT OR ADD ANY CODE HERE! + $$$setupUI$$$(); + } + + /** + * Method generated by IntelliJ IDEA GUI Designer + * >>> IMPORTANT!! <<< + * DO NOT edit this method OR call it in your code! + * + * @noinspection ALL + */ + private void $$$setupUI$$$() { + final JPanel panel1 = new JPanel(); + panel1.setLayout(new GridLayoutManager(1, 1, new Insets(0, 0, 0, 0), -1, -1)); + templateMsgPanel = new JPanel(); + templateMsgPanel.setLayout(new GridLayoutManager(2, 3, new Insets(10, 5, 0, 0), -1, -1)); + panel1.add(templateMsgPanel, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_WANT_GROW, null, null, null, 0, false)); + templateMsgPanel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEmptyBorder(), "", TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION, this.$$$getFont$$$(null, Font.BOLD, -1, templateMsgPanel.getFont()))); + templateMsgDataPanel = new JPanel(); + templateMsgDataPanel.setLayout(new GridLayoutManager(3, 3, new Insets(10, 0, 0, 0), -1, -1)); + templateMsgPanel.add(templateMsgDataPanel, new GridConstraints(1, 0, 1, 3, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_WANT_GROW, null, null, null, 0, false)); + templateMsgDataPanel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), "短信模板变量(可使用\"$ENTER$\"作为换行符)", TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION, this.$$$getFont$$$(null, Font.BOLD, -1, templateMsgDataPanel.getFont()))); + templateDataNameTextField = new JTextField(); + templateDataNameTextField.setToolTipText("当消息类型是模板消息时的示例:first或者keyword1或者remark之类的"); + templateMsgDataPanel.add(templateDataNameTextField, new GridConstraints(1, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_FIXED, null, new Dimension(150, -1), null, 0, false)); + templateDataValueTextField = new JTextField(); + templateMsgDataPanel.add(templateDataValueTextField, new GridConstraints(1, 1, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_FIXED, null, new Dimension(150, -1), null, 0, false)); + templateMsgDataAddButton = new JButton(); + templateMsgDataAddButton.setIcon(new ImageIcon(getClass().getResource("/icon/add.png"))); + templateMsgDataAddButton.setText(""); + templateMsgDataPanel.add(templateMsgDataAddButton, new GridConstraints(1, 2, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + templateMsgDataTable = new JTable(); + templateMsgDataTable.setAutoCreateColumnsFromModel(true); + templateMsgDataTable.setAutoCreateRowSorter(true); + templateMsgDataTable.setGridColor(new Color(-12236470)); + templateMsgDataTable.setRowHeight(36); + templateMsgDataPanel.add(templateMsgDataTable, new GridConstraints(2, 0, 1, 3, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_WANT_GROW, null, null, null, 0, false)); + templateMsgNameLabel = new JLabel(); + templateMsgNameLabel.setText("模板参数"); + templateMsgNameLabel.setToolTipText("当消息类型是模板消息时的示例:first或者keyword1或者remark之类的"); + templateMsgDataPanel.add(templateMsgNameLabel, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + templateMsgValueLabel = new JLabel(); + templateMsgValueLabel.setText("参数对应的值"); + templateMsgDataPanel.add(templateMsgValueLabel, new GridConstraints(0, 1, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + final JPanel panel2 = new JPanel(); + panel2.setLayout(new GridLayoutManager(1, 2, new Insets(0, 5, 10, 5), -1, -1)); + templateMsgPanel.add(panel2, new GridConstraints(0, 0, 1, 3, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, null, null, 0, false)); + templateIdLabel = new JLabel(); + templateIdLabel.setText("短信模板ID *"); + panel2.add(templateIdLabel, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + msgTemplateIdTextField = new JTextField(); + panel2.add(msgTemplateIdTextField, new GridConstraints(0, 1, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_FIXED, null, new Dimension(150, -1), null, 0, false)); + templateMsgNameLabel.setLabelFor(templateDataNameTextField); + templateMsgValueLabel.setLabelFor(templateDataValueTextField); + templateIdLabel.setLabelFor(msgTemplateIdTextField); + } + + /** + * @noinspection ALL + */ + private Font $$$getFont$$$(String fontName, int style, int size, Font currentFont) { + if (currentFont == null) return null; + String resultName; + if (fontName == null) { + resultName = currentFont.getName(); + } else { + Font testFont = new Font(fontName, Font.PLAIN, 10); + if (testFont.canDisplay('a') && testFont.canDisplay('1')) { + resultName = fontName; + } else { + resultName = currentFont.getName(); + } + } + return new Font(resultName, style >= 0 ? style : currentFont.getStyle(), size >= 0 ? size : currentFont.getSize()); + } + +} diff --git a/src/main/java/com/fangxuele/tool/push/ui/listener/MessageTypeListener.java b/src/main/java/com/fangxuele/tool/push/ui/listener/MessageTypeListener.java index 1ea38f95..32fa84e9 100644 --- a/src/main/java/com/fangxuele/tool/push/ui/listener/MessageTypeListener.java +++ b/src/main/java/com/fangxuele/tool/push/ui/listener/MessageTypeListener.java @@ -48,6 +48,10 @@ public static void addListeners() { App.config.setMsgType(MessageTypeEnum.TX_YUN_CODE); saveType(); }); + messageTypeForm.getQiniuRadioButton().addActionListener(e -> { + App.config.setMsgType(MessageTypeEnum.QI_NIU_YUN_CODE); + saveType(); + }); messageTypeForm.getBdYunRadioButton().addActionListener(e -> { App.config.setMsgType(MessageTypeEnum.BD_YUN_CODE); saveType(); diff --git a/src/main/java/com/fangxuele/tool/push/ui/listener/MsgEditListener.java b/src/main/java/com/fangxuele/tool/push/ui/listener/MsgEditListener.java index 796e27f5..170d6f08 100644 --- a/src/main/java/com/fangxuele/tool/push/ui/listener/MsgEditListener.java +++ b/src/main/java/com/fangxuele/tool/push/ui/listener/MsgEditListener.java @@ -160,7 +160,8 @@ public void mousePressed(MouseEvent e) { paraDemo = "manager9115|manager9116|manager9117"; } else if (msgType == MessageTypeEnum.ALI_YUN_CODE || msgType == MessageTypeEnum.TX_YUN_CODE || msgType == MessageTypeEnum.HW_YUN_CODE || msgType == MessageTypeEnum.BD_YUN_CODE - || msgType == MessageTypeEnum.UP_YUN_CODE || msgType == MessageTypeEnum.YUN_PIAN_CODE) { + || msgType == MessageTypeEnum.UP_YUN_CODE || msgType == MessageTypeEnum.YUN_PIAN_CODE + || msgType == MessageTypeEnum.QI_NIU_YUN_CODE) { fillParaName = "预览消息用户的手机号"; paraDemo = "13910733521;13910733522"; } From 5a7b607812220bcd6979b6c42283b56ecae47816 Mon Sep 17 00:00:00 2001 From: sunsence Date: Sun, 15 Sep 2019 21:55:53 +0800 Subject: [PATCH 07/16] =?UTF-8?q?feature:=E5=A2=9E=E5=8A=A0=E5=AF=B9?= =?UTF-8?q?=E4=B8=83=E7=89=9B=E4=BA=91=E7=9F=AD=E4=BF=A1=E7=9A=84=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E5=AE=8C=E6=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../push/logic/msgmaker/BdYunMsgMaker.java | 4 +- .../push/logic/msgmaker/QiNiuYunMsgMaker.java | 26 +++++----- .../logic/msgsender/QiNiuYunMsgSender.java | 51 ++++++++++--------- .../push/ui/listener/SettingListener.java | 2 +- 4 files changed, 44 insertions(+), 39 deletions(-) diff --git a/src/main/java/com/fangxuele/tool/push/logic/msgmaker/BdYunMsgMaker.java b/src/main/java/com/fangxuele/tool/push/logic/msgmaker/BdYunMsgMaker.java index c0a48ba2..57ae049d 100644 --- a/src/main/java/com/fangxuele/tool/push/logic/msgmaker/BdYunMsgMaker.java +++ b/src/main/java/com/fangxuele/tool/push/logic/msgmaker/BdYunMsgMaker.java @@ -53,8 +53,8 @@ public void prepare() { public Map makeMsg(String[] msgData) { VelocityContext velocityContext = getVelocityContext(msgData); - for (Map.Entry stringStringEntry : paramMap.entrySet()) { - stringStringEntry.setValue(TemplateUtil.evaluate(stringStringEntry.getValue(), velocityContext)); + for (Map.Entry entry : paramMap.entrySet()) { + entry.setValue(TemplateUtil.evaluate(entry.getValue(), velocityContext)); } return paramMap; } diff --git a/src/main/java/com/fangxuele/tool/push/logic/msgmaker/QiNiuYunMsgMaker.java b/src/main/java/com/fangxuele/tool/push/logic/msgmaker/QiNiuYunMsgMaker.java index 3449e3d7..89025a74 100644 --- a/src/main/java/com/fangxuele/tool/push/logic/msgmaker/QiNiuYunMsgMaker.java +++ b/src/main/java/com/fangxuele/tool/push/logic/msgmaker/QiNiuYunMsgMaker.java @@ -2,11 +2,11 @@ import com.fangxuele.tool.push.ui.form.msg.QiNiuYunMsgForm; import com.fangxuele.tool.push.util.TemplateUtil; -import org.apache.commons.compress.utils.Lists; +import com.google.common.collect.Maps; import org.apache.velocity.VelocityContext; import javax.swing.table.DefaultTableModel; -import java.util.List; +import java.util.Map; /** *
@@ -16,18 +16,18 @@
  * @author Zhou Bo
  * @since 2019/6/14.
  */
-public class QiNiuYunMsgMaker extends BaseMsgMaker implements IMsgMaker{
+public class QiNiuYunMsgMaker extends BaseMsgMaker implements IMsgMaker {
 
-    public static int templateId;
+    public static String templateId;
 
-    public static List paramList;
+    public static Map paramMap;
 
     /**
      * 准备(界面字段等)
      */
     @Override
     public void prepare() {
-        templateId = Integer.parseInt(QiNiuYunMsgForm.getInstance().getMsgTemplateIdTextField().getText());
+        templateId = QiNiuYunMsgForm.getInstance().getMsgTemplateIdTextField().getText();
 
         if (QiNiuYunMsgForm.getInstance().getTemplateMsgDataTable().getModel().getRowCount() == 0) {
             QiNiuYunMsgForm.initTemplateDataTable();
@@ -35,10 +35,11 @@ public void prepare() {
 
         DefaultTableModel tableModel = (DefaultTableModel) QiNiuYunMsgForm.getInstance().getTemplateMsgDataTable().getModel();
         int rowCount = tableModel.getRowCount();
-        paramList = Lists.newArrayList();
+        paramMap = Maps.newHashMap();
         for (int i = 0; i < rowCount; i++) {
+            String key = ((String) tableModel.getValueAt(i, 0));
             String value = ((String) tableModel.getValueAt(i, 1));
-            paramList.add(value);
+            paramMap.put(key, value);
         }
     }
 
@@ -49,13 +50,12 @@ public void prepare() {
      * @return String[]
      */
     @Override
-    public String[] makeMsg(String[] msgData) {
+    public Map makeMsg(String[] msgData) {
 
         VelocityContext velocityContext = getVelocityContext(msgData);
-        for (int i = 0; i < paramList.size(); i++) {
-            paramList.set(i, TemplateUtil.evaluate(paramList.get(i), velocityContext));
+        for (Map.Entry entry : paramMap.entrySet()) {
+            entry.setValue(TemplateUtil.evaluate(entry.getValue(), velocityContext));
         }
-        String[] paramArray = new String[paramList.size()];
-        return paramList.toArray(paramArray);
+        return paramMap;
     }
 }
diff --git a/src/main/java/com/fangxuele/tool/push/logic/msgsender/QiNiuYunMsgSender.java b/src/main/java/com/fangxuele/tool/push/logic/msgsender/QiNiuYunMsgSender.java
index 94e8c8d4..56034370 100644
--- a/src/main/java/com/fangxuele/tool/push/logic/msgsender/QiNiuYunMsgSender.java
+++ b/src/main/java/com/fangxuele/tool/push/logic/msgsender/QiNiuYunMsgSender.java
@@ -3,13 +3,17 @@
 import com.fangxuele.tool.push.App;
 import com.fangxuele.tool.push.logic.PushControl;
 import com.fangxuele.tool.push.logic.msgmaker.QiNiuYunMsgMaker;
-import com.github.qcloudsms.SmsSingleSender;
-import com.github.qcloudsms.SmsSingleSenderResult;
+import com.qiniu.http.Response;
+import com.qiniu.sms.SmsManager;
+import com.qiniu.util.Auth;
 import lombok.extern.slf4j.Slf4j;
 
+import java.util.Map;
+
 /**
  * 
  * 七牛云模板短信发送器
+ * 部分代码来源于官网文档示例
  * 
* * @author RememBerBer @@ -18,38 +22,37 @@ @Slf4j public class QiNiuYunMsgSender implements IMsgSender { /** - * 七牛云短信sender + * 七牛云短信smsManager */ - public volatile static SmsSingleSender smsSingleSender; + public volatile static SmsManager smsManager; private QiNiuYunMsgMaker qiNiuYunMsgMaker; public QiNiuYunMsgSender() { qiNiuYunMsgMaker = new QiNiuYunMsgMaker(); - smsSingleSender = getTxYunSender(); + smsManager = getSmsManager(); } @Override public SendResult send(String[] msgData) { SendResult sendResult = new SendResult(); try { - int templateId = QiNiuYunMsgMaker.templateId; - String smsSign = App.config.getTxyunSign(); - String[] params = qiNiuYunMsgMaker.makeMsg(msgData); + String templateId = QiNiuYunMsgMaker.templateId; + Map params = qiNiuYunMsgMaker.makeMsg(msgData); String telNum = msgData[0]; + if (PushControl.dryRun) { sendResult.setSuccess(true); return sendResult; } else { - SmsSingleSenderResult result = smsSingleSender.sendWithParam("86", telNum, - templateId, params, smsSign, "", ""); + Response resp = smsManager.sendMessage(templateId, new String[]{telNum}, params); - if (result.result == 0) { - sendResult.setSuccess(true); - } else { - sendResult.setSuccess(false); - sendResult.setInfo(result.toString()); - } +// if (resp.statusCode == 200) { + sendResult.setSuccess(true); +// } else { +// sendResult.setSuccess(false); +// sendResult.setInfo(resp.error); +// } } } catch (Exception e) { sendResult.setSuccess(false); @@ -70,17 +73,19 @@ public SendResult asyncSend(String[] msgData) { * * @return SmsSingleSender */ - private static SmsSingleSender getTxYunSender() { - if (smsSingleSender == null) { + private static SmsManager getSmsManager() { + if (smsManager == null) { synchronized (QiNiuYunMsgSender.class) { - if (smsSingleSender == null) { - String txyunAppId = App.config.getTxyunAppId(); - String txyunAppKey = App.config.getTxyunAppKey(); + if (smsManager == null) { + // 设置需要操作的账号的AK和SK + String qiniuAccessKey = App.config.getQiniuAccessKey(); + String qiniuSecretKey = App.config.getQiniuSecretKey(); + Auth auth = Auth.create(qiniuAccessKey, qiniuSecretKey); - smsSingleSender = new SmsSingleSender(Integer.parseInt(txyunAppId), txyunAppKey); + smsManager = new SmsManager(auth); } } } - return smsSingleSender; + return smsManager; } } diff --git a/src/main/java/com/fangxuele/tool/push/ui/listener/SettingListener.java b/src/main/java/com/fangxuele/tool/push/ui/listener/SettingListener.java index df60ae27..e1086f9b 100644 --- a/src/main/java/com/fangxuele/tool/push/ui/listener/SettingListener.java +++ b/src/main/java/com/fangxuele/tool/push/ui/listener/SettingListener.java @@ -359,7 +359,7 @@ public static void addListeners() { App.config.setQiniuSecretKey(settingForm.getQiniuSecretKeyTextField().getText()); App.config.save(); -// TODO HttpMsgSender.okHttpClient = null; + QiNiuYunMsgSender.smsManager = null; JOptionPane.showMessageDialog(settingPanel, "保存成功!", "成功", JOptionPane.INFORMATION_MESSAGE); From 3a9771fc31ff701dc4679984987994d185070900 Mon Sep 17 00:00:00 2001 From: duoduo Date: Mon, 16 Sep 2019 08:58:29 +0800 Subject: [PATCH 08/16] code optimization --- .../com/fangxuele/tool/push/ui/form/msg/MsgFormFactory.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/java/com/fangxuele/tool/push/ui/form/msg/MsgFormFactory.java b/src/main/java/com/fangxuele/tool/push/ui/form/msg/MsgFormFactory.java index 72aea495..457c5791 100644 --- a/src/main/java/com/fangxuele/tool/push/ui/form/msg/MsgFormFactory.java +++ b/src/main/java/com/fangxuele/tool/push/ui/form/msg/MsgFormFactory.java @@ -59,15 +59,13 @@ public static IMsgForm getMsgForm() { case MessageTypeEnum.WX_CP_CODE: iMsgForm = WxCpMsgForm.getInstance(); break; - case MessageTypeEnum.HTTP_CODE: - iMsgForm = HttpMsgForm.getInstance(); - break; case MessageTypeEnum.DING_CODE: iMsgForm = DingMsgForm.getInstance(); break; case MessageTypeEnum.BD_YUN_CODE: iMsgForm = BdYunMsgForm.getInstance(); break; + case MessageTypeEnum.HTTP_CODE: default: iMsgForm = HttpMsgForm.getInstance(); } From 22f2ee4cce18de234cd84e08b0dcb9ea181211f5 Mon Sep 17 00:00:00 2001 From: duoduo Date: Fri, 27 Sep 2019 23:39:47 +0800 Subject: [PATCH 09/16] =?UTF-8?q?optimization=EF=BC=9A=E5=BE=AE=E4=BF=A1?= =?UTF-8?q?=E5=85=AC=E4=BC=97=E5=8F=B7=E6=B6=88=E6=81=AF=E5=89=8D=E7=BD=AE?= =?UTF-8?q?=E6=A0=A1=E9=AA=8C=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fangxuele/tool/push/logic/PushControl.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/main/java/com/fangxuele/tool/push/logic/PushControl.java b/src/main/java/com/fangxuele/tool/push/logic/PushControl.java index 8eeb2ffb..fb214073 100644 --- a/src/main/java/com/fangxuele/tool/push/logic/PushControl.java +++ b/src/main/java/com/fangxuele/tool/push/logic/PushControl.java @@ -150,6 +150,20 @@ public static boolean configCheck() { case MessageTypeEnum.MP_TEMPLATE_CODE: case MessageTypeEnum.KEFU_CODE: case MessageTypeEnum.KEFU_PRIORITY_CODE: { + if (App.config.isMpUseOutSideAt()) { + if (App.config.isMpManualAt() && + (StringUtils.isEmpty(App.config.getMpAt()) || StringUtils.isEmpty(App.config.getMpAtExpiresIn()))) { + JOptionPane.showMessageDialog(settingForm.getSettingPanel(), "请先在设置中填写并保存手动输入的外部accessToken信息!", "提示", + JOptionPane.INFORMATION_MESSAGE); + return false; + } + if (App.config.isMpApiAt() && StringUtils.isEmpty(App.config.getMpAtApiUrl())) { + JOptionPane.showMessageDialog(settingForm.getSettingPanel(), "请先在设置中填写并保存用于获取外部accessToken的URL!", "提示", + JOptionPane.INFORMATION_MESSAGE); + return false; + } + return true; + } if (StringUtils.isEmpty(App.config.getWechatAppId()) || StringUtils.isEmpty(App.config.getWechatAppSecret())) { JOptionPane.showMessageDialog(settingForm.getSettingPanel(), "请先在设置中填写并保存公众号相关配置!", "提示", JOptionPane.INFORMATION_MESSAGE); From 907661cdc8c8190882f705ada200f0836cd83258 Mon Sep 17 00:00:00 2001 From: duoduo Date: Sat, 28 Sep 2019 11:39:39 +0800 Subject: [PATCH 10/16] =?UTF-8?q?feature:=E5=A2=9E=E5=8A=A0=E7=B3=BB?= =?UTF-8?q?=E7=BB=9F=E6=89=98=E7=9B=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fangxuele/tool/push/App.java | 1 + .../java/com/fangxuele/tool/push/ui/Init.java | 81 ++++++++++++++++++- 2 files changed, 81 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/fangxuele/tool/push/App.java b/src/main/java/com/fangxuele/tool/push/App.java index 9cda8b42..6badc957 100644 --- a/src/main/java/com/fangxuele/tool/push/App.java +++ b/src/main/java/com/fangxuele/tool/push/App.java @@ -53,5 +53,6 @@ public static void main(String[] args) { mainFrame.addListeners(); mainFrame.remove(loadingPanel); Init.initFontSize(); + Init.initTray(); } } diff --git a/src/main/java/com/fangxuele/tool/push/ui/Init.java b/src/main/java/com/fangxuele/tool/push/ui/Init.java index 4abd2ba7..ed320eee 100644 --- a/src/main/java/com/fangxuele/tool/push/ui/Init.java +++ b/src/main/java/com/fangxuele/tool/push/ui/Init.java @@ -8,7 +8,6 @@ import com.fangxuele.tool.push.ui.form.AboutForm; import com.fangxuele.tool.push.ui.form.BoostForm; import com.fangxuele.tool.push.ui.form.HelpForm; -import com.fangxuele.tool.push.ui.form.HttpResultForm; import com.fangxuele.tool.push.ui.form.MemberForm; import com.fangxuele.tool.push.ui.form.MessageEditForm; import com.fangxuele.tool.push.ui.form.MessageManageForm; @@ -23,11 +22,14 @@ import com.fangxuele.tool.push.util.UIUtil; import com.fangxuele.tool.push.util.UpgradeUtil; import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.exception.ExceptionUtils; import org.jb2011.lnf.beautyeye.BeautyEyeLNFHelper; import javax.swing.*; import javax.swing.plaf.FontUIResource; import java.awt.*; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; import java.util.Enumeration; /** @@ -150,4 +152,81 @@ public static void initFontSize() { App.config.setProps(FONT_SIZE_INIT_PROP, "true"); App.config.save(); } + + /** + * 初始化系统托盘 + */ + public static void initTray() { + + try { + if (SystemTray.isSupported()) { + SystemTray tray = SystemTray.getSystemTray(); + + PopupMenu popupMenu = new PopupMenu(); + popupMenu.setFont(App.mainFrame.getContentPane().getFont()); + + MenuItem openItem = new MenuItem("WePush"); + MenuItem exitItem = new MenuItem("Quit"); + + openItem.addActionListener(e -> { + App.mainFrame.setExtendedState(JFrame.NORMAL); + App.mainFrame.setVisible(true); + App.mainFrame.requestFocus(); + }); + exitItem.addActionListener(e -> { + App.config.save(); + App.sqlSession.close(); + System.exit(0); + }); + + popupMenu.add(openItem); + popupMenu.add(exitItem); + + TrayIcon trayIcon = new TrayIcon(UiConsts.IMAGE_LOGO_64, "WePush", popupMenu); + trayIcon.setImageAutoSize(true); + + trayIcon.addActionListener(e -> { + App.mainFrame.setExtendedState(JFrame.NORMAL); + App.mainFrame.setVisible(true); + App.mainFrame.requestFocus(); + }); + trayIcon.addMouseListener(new MouseAdapter() { + @Override + public void mouseClicked(MouseEvent e) { + switch (e.getButton()) { + case MouseEvent.BUTTON1: { + App.mainFrame.setExtendedState(JFrame.NORMAL); + App.mainFrame.setVisible(true); + App.mainFrame.requestFocus(); + break; + } + case MouseEvent.BUTTON2: { + logger.debug("托盘图标被鼠标中键被点击"); + break; + } + case MouseEvent.BUTTON3: { + logger.debug("托盘图标被鼠标右键被点击"); + break; + } + default: { + break; + } + } + } + }); + + try { + tray.add(trayIcon); + trayIcon.displayMessage("WePush", "WePush已显示在系统托盘", TrayIcon.MessageType.INFO); + } catch (AWTException e) { + e.printStackTrace(); + logger.error(ExceptionUtils.getStackTrace(e)); + } + + } + + } catch (Exception e) { + logger.error(ExceptionUtils.getStackTrace(e)); + } + } } From 9e0fe987ca57de42ded62f36d0cbcabadb850b0b Mon Sep 17 00:00:00 2001 From: duoduo Date: Sat, 28 Sep 2019 11:43:48 +0800 Subject: [PATCH 11/16] =?UTF-8?q?feature:=E5=A2=9E=E5=8A=A0=E7=B3=BB?= =?UTF-8?q?=E7=BB=9F=E6=89=98=E7=9B=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/fangxuele/tool/push/App.java | 4 ++++ src/main/java/com/fangxuele/tool/push/ui/Init.java | 14 +++++++------- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/fangxuele/tool/push/App.java b/src/main/java/com/fangxuele/tool/push/App.java index 6badc957..b10d45c9 100644 --- a/src/main/java/com/fangxuele/tool/push/App.java +++ b/src/main/java/com/fangxuele/tool/push/App.java @@ -29,6 +29,10 @@ public class App { public static SqlSession sqlSession = MybatisUtil.getSqlSession(); + public static SystemTray tray; + + public static TrayIcon trayIcon; + public static void main(String[] args) { Init.initTheme(); mainFrame = new MainFrame(); diff --git a/src/main/java/com/fangxuele/tool/push/ui/Init.java b/src/main/java/com/fangxuele/tool/push/ui/Init.java index ed320eee..21a45db3 100644 --- a/src/main/java/com/fangxuele/tool/push/ui/Init.java +++ b/src/main/java/com/fangxuele/tool/push/ui/Init.java @@ -160,7 +160,7 @@ public static void initTray() { try { if (SystemTray.isSupported()) { - SystemTray tray = SystemTray.getSystemTray(); + App.tray = SystemTray.getSystemTray(); PopupMenu popupMenu = new PopupMenu(); popupMenu.setFont(App.mainFrame.getContentPane().getFont()); @@ -182,15 +182,15 @@ public static void initTray() { popupMenu.add(openItem); popupMenu.add(exitItem); - TrayIcon trayIcon = new TrayIcon(UiConsts.IMAGE_LOGO_64, "WePush", popupMenu); - trayIcon.setImageAutoSize(true); + App.trayIcon = new TrayIcon(UiConsts.IMAGE_LOGO_64, "WePush", popupMenu); + App.trayIcon.setImageAutoSize(true); - trayIcon.addActionListener(e -> { + App.trayIcon.addActionListener(e -> { App.mainFrame.setExtendedState(JFrame.NORMAL); App.mainFrame.setVisible(true); App.mainFrame.requestFocus(); }); - trayIcon.addMouseListener(new MouseAdapter() { + App.trayIcon.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { switch (e.getButton()) { @@ -216,8 +216,8 @@ public void mouseClicked(MouseEvent e) { }); try { - tray.add(trayIcon); - trayIcon.displayMessage("WePush", "WePush已显示在系统托盘", TrayIcon.MessageType.INFO); + App.tray.add(App.trayIcon); + App.trayIcon.displayMessage("WePush", "WePush已显示在系统托盘", TrayIcon.MessageType.INFO); } catch (AWTException e) { e.printStackTrace(); logger.error(ExceptionUtils.getStackTrace(e)); From 6b220cadd55d85bee7e6e102e8b4b02e412b4d86 Mon Sep 17 00:00:00 2001 From: duoduo Date: Sat, 28 Sep 2019 11:51:10 +0800 Subject: [PATCH 12/16] =?UTF-8?q?feature:=E5=A2=9E=E5=8A=A0=E7=B3=BB?= =?UTF-8?q?=E7=BB=9F=E6=89=98=E7=9B=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fangxuele/tool/push/logic/PushRunThread.java | 9 +++++++++ src/main/java/com/fangxuele/tool/push/ui/Init.java | 1 - 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/fangxuele/tool/push/logic/PushRunThread.java b/src/main/java/com/fangxuele/tool/push/logic/PushRunThread.java index 05d74de7..b3ab5157 100644 --- a/src/main/java/com/fangxuele/tool/push/logic/PushRunThread.java +++ b/src/main/java/com/fangxuele/tool/push/logic/PushRunThread.java @@ -14,6 +14,7 @@ import com.fangxuele.tool.push.logic.msgthread.BaseMsgThread; import com.fangxuele.tool.push.logic.msgthread.MsgSendThread; import com.fangxuele.tool.push.ui.component.TableInCellProgressBarRenderer; +import com.fangxuele.tool.push.ui.form.MessageEditForm; import com.fangxuele.tool.push.ui.form.PushForm; import com.fangxuele.tool.push.util.ConsoleUtil; import org.apache.commons.lang3.time.DateFormatUtils; @@ -21,6 +22,7 @@ import javax.swing.*; import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.DefaultTableModel; +import java.awt.*; import java.io.IOException; import java.util.Date; import java.util.concurrent.ThreadPoolExecutor; @@ -178,6 +180,13 @@ private void timeMonitor() { pushForm.getScheduleRunButton().setEnabled(true); pushForm.getScheduleRunButton().updateUI(); pushForm.getScheduleDetailLabel().setText(""); + + if (App.trayIcon != null) { + MessageEditForm messageEditForm = MessageEditForm.getInstance(); + String msgName = messageEditForm.getMsgNameField().getText(); + App.trayIcon.displayMessage("WePush", msgName + " 发送完毕!", TrayIcon.MessageType.INFO); + } + String finishTip = "发送完毕!\n"; JOptionPane.showMessageDialog(pushForm.getPushPanel(), finishTip, "提示", JOptionPane.INFORMATION_MESSAGE); diff --git a/src/main/java/com/fangxuele/tool/push/ui/Init.java b/src/main/java/com/fangxuele/tool/push/ui/Init.java index 21a45db3..896c0a03 100644 --- a/src/main/java/com/fangxuele/tool/push/ui/Init.java +++ b/src/main/java/com/fangxuele/tool/push/ui/Init.java @@ -217,7 +217,6 @@ public void mouseClicked(MouseEvent e) { try { App.tray.add(App.trayIcon); - App.trayIcon.displayMessage("WePush", "WePush已显示在系统托盘", TrayIcon.MessageType.INFO); } catch (AWTException e) { e.printStackTrace(); logger.error(ExceptionUtils.getStackTrace(e)); From 9e436f2adf66b42502ae02f6251e59a9c431e692 Mon Sep 17 00:00:00 2001 From: duoduo Date: Sat, 28 Sep 2019 11:54:52 +0800 Subject: [PATCH 13/16] =?UTF-8?q?feature:=E5=A2=9E=E5=8A=A0=E7=B3=BB?= =?UTF-8?q?=E7=BB=9F=E6=89=98=E7=9B=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fangxuele/tool/push/ui/Init.java | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/fangxuele/tool/push/ui/Init.java b/src/main/java/com/fangxuele/tool/push/ui/Init.java index 896c0a03..47fbd951 100644 --- a/src/main/java/com/fangxuele/tool/push/ui/Init.java +++ b/src/main/java/com/fangxuele/tool/push/ui/Init.java @@ -8,6 +8,7 @@ import com.fangxuele.tool.push.ui.form.AboutForm; import com.fangxuele.tool.push.ui.form.BoostForm; import com.fangxuele.tool.push.ui.form.HelpForm; +import com.fangxuele.tool.push.ui.form.MainWindow; import com.fangxuele.tool.push.ui.form.MemberForm; import com.fangxuele.tool.push.ui.form.MessageEditForm; import com.fangxuele.tool.push.ui.form.MessageManageForm; @@ -32,6 +33,8 @@ import java.awt.event.MouseEvent; import java.util.Enumeration; +import static com.fangxuele.tool.push.App.mainFrame; + /** *
  * 初始化类
@@ -174,9 +177,15 @@ public static void initTray() {
                     App.mainFrame.requestFocus();
                 });
                 exitItem.addActionListener(e -> {
-                    App.config.save();
-                    App.sqlSession.close();
-                    System.exit(0);
+                    if (!PushForm.getInstance().getPushStartButton().isEnabled()) {
+                        JOptionPane.showMessageDialog(MainWindow.getInstance().getPushPanel(),
+                                "有推送任务正在进行!\n\n为避免数据丢失,请先停止!\n\n", "Sorry~",
+                                JOptionPane.WARNING_MESSAGE);
+                    } else {
+                        App.config.save();
+                        App.sqlSession.close();
+                        System.exit(0);
+                    }
                 });
 
                 popupMenu.add(openItem);

From e9f5671d33c05523077b83256a8b8ad52e84e574 Mon Sep 17 00:00:00 2001
From: duoduo 
Date: Sat, 28 Sep 2019 12:06:27 +0800
Subject: [PATCH 14/16] =?UTF-8?q?feature:=E5=A2=9E=E5=8A=A0=E7=B3=BB?=
 =?UTF-8?q?=E7=BB=9F=E6=89=98=E7=9B=98=E5=BC=80=E5=85=B3=E8=AE=BE=E7=BD=AE?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/main/java/com/fangxuele/tool/push/ui/Init.java   |  4 +---
 .../com/fangxuele/tool/push/ui/form/SettingForm.form | 10 +++++++++-
 .../com/fangxuele/tool/push/ui/form/SettingForm.java |  7 ++++++-
 .../tool/push/ui/listener/SettingListener.java       | 12 ++++++++++++
 .../com/fangxuele/tool/push/util/ConfigUtil.java     | 10 ++++++++++
 5 files changed, 38 insertions(+), 5 deletions(-)

diff --git a/src/main/java/com/fangxuele/tool/push/ui/Init.java b/src/main/java/com/fangxuele/tool/push/ui/Init.java
index 47fbd951..477319b3 100644
--- a/src/main/java/com/fangxuele/tool/push/ui/Init.java
+++ b/src/main/java/com/fangxuele/tool/push/ui/Init.java
@@ -33,8 +33,6 @@
 import java.awt.event.MouseEvent;
 import java.util.Enumeration;
 
-import static com.fangxuele.tool.push.App.mainFrame;
-
 /**
  * 
  * 初始化类
@@ -162,7 +160,7 @@ public static void initFontSize() {
     public static void initTray() {
 
         try {
-            if (SystemTray.isSupported()) {
+            if (App.config.isUseTray() && SystemTray.isSupported()) {
                 App.tray = SystemTray.getSystemTray();
 
                 PopupMenu popupMenu = new PopupMenu();
diff --git a/src/main/java/com/fangxuele/tool/push/ui/form/SettingForm.form b/src/main/java/com/fangxuele/tool/push/ui/form/SettingForm.form
index 94834959..2b402934 100644
--- a/src/main/java/com/fangxuele/tool/push/ui/form/SettingForm.form
+++ b/src/main/java/com/fangxuele/tool/push/ui/form/SettingForm.form
@@ -46,7 +46,7 @@
                     
                     
                     
-                      
+                      
                         
                         
                           
@@ -64,6 +64,14 @@
                               
                             
                           
+                          
+                            
+                              
+                            
+                            
+                              
+                            
+                          
                         
                       
                       
diff --git a/src/main/java/com/fangxuele/tool/push/ui/form/SettingForm.java b/src/main/java/com/fangxuele/tool/push/ui/form/SettingForm.java
index 5ce0b4bc..b6e436b8 100644
--- a/src/main/java/com/fangxuele/tool/push/ui/form/SettingForm.java
+++ b/src/main/java/com/fangxuele/tool/push/ui/form/SettingForm.java
@@ -120,6 +120,7 @@ public class SettingForm {
     private JTextField qiniuAccessKeyTextField;
     private JButton qiniuSaveButton;
     private JTextField qiniuSecretKeyTextField;
+    private JCheckBox useTrayCheckBox;
 
     private static SettingForm settingForm;
     private static TWxAccountMapper wxAccountMapper = MybatisUtil.getSqlSession().getMapper(TWxAccountMapper.class);
@@ -156,6 +157,7 @@ public static void init() {
 
         // 常规
         settingForm.getAutoCheckUpdateCheckBox().setSelected(App.config.isAutoCheckUpdate());
+        settingForm.getUseTrayCheckBox().setSelected(App.config.isUseTray());
 
         // 微信公众号
         settingForm.getMpAccountSwitchComboBox().setSelectedItem(App.config.getWechatMpName());
@@ -388,12 +390,15 @@ public static void toggleMpOutSideAccessTokenPanel() {
         panel3.setLayout(new GridLayoutManager(16, 1, new Insets(40, 60, 0, 330), -1, -1));
         panel2.add(panel3, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, new Dimension(600, -1), null, 0, false));
         final JPanel panel4 = new JPanel();
-        panel4.setLayout(new GridLayoutManager(1, 1, new Insets(15, 15, 10, 0), -1, -1));
+        panel4.setLayout(new GridLayoutManager(2, 1, new Insets(15, 15, 10, 0), -1, -1));
         panel3.add(panel4, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, null, null, 0, false));
         panel4.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEmptyBorder(), "常规", TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION, this.$$$getFont$$$(null, Font.BOLD, -1, panel4.getFont())));
         autoCheckUpdateCheckBox = new JCheckBox();
         autoCheckUpdateCheckBox.setText("启动时自动检查更新");
         panel4.add(autoCheckUpdateCheckBox, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
+        useTrayCheckBox = new JCheckBox();
+        useTrayCheckBox.setText("显示系统托盘图标");
+        panel4.add(useTrayCheckBox, new GridConstraints(1, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
         final JPanel panel5 = new JPanel();
         panel5.setLayout(new GridLayoutManager(6, 3, new Insets(15, 15, 10, 0), -1, -1));
         Font panel5Font = this.$$$getFont$$$("Microsoft YaHei UI", -1, -1, panel5.getFont());
diff --git a/src/main/java/com/fangxuele/tool/push/ui/listener/SettingListener.java b/src/main/java/com/fangxuele/tool/push/ui/listener/SettingListener.java
index e1086f9b..fa9c9dbd 100644
--- a/src/main/java/com/fangxuele/tool/push/ui/listener/SettingListener.java
+++ b/src/main/java/com/fangxuele/tool/push/ui/listener/SettingListener.java
@@ -51,6 +51,18 @@ public static void addListeners() {
             App.config.setAutoCheckUpdate(settingForm.getAutoCheckUpdateCheckBox().isSelected());
             App.config.save();
         });
+        // 设置-常规-显示系统托盘图标
+        settingForm.getUseTrayCheckBox().addActionListener(e -> {
+            App.config.setUseTray(settingForm.getUseTrayCheckBox().isSelected());
+            App.config.save();
+            if (App.tray == null && App.config.isUseTray()) {
+                Init.initTray();
+            } else if (App.tray != null && !App.config.isUseTray()) {
+                App.tray.remove(App.trayIcon);
+                App.trayIcon = null;
+                App.tray = null;
+            }
+        });
 
         // 设置-公众号-保存
         settingForm.getSettingMpInfoSaveButton().addActionListener(e -> {
diff --git a/src/main/java/com/fangxuele/tool/push/util/ConfigUtil.java b/src/main/java/com/fangxuele/tool/push/util/ConfigUtil.java
index beb7377c..4c4f98fc 100644
--- a/src/main/java/com/fangxuele/tool/push/util/ConfigUtil.java
+++ b/src/main/java/com/fangxuele/tool/push/util/ConfigUtil.java
@@ -60,6 +60,8 @@ private ConfigUtil() {
 
     private boolean autoCheckUpdate;
 
+    private boolean useTray;
+
     private long pushTotal;
 
     private String beforeVersion;
@@ -373,6 +375,14 @@ public void setAutoCheckUpdate(boolean autoCheckUpdate) {
         setting.put("setting.normal", "autoCheckUpdate", String.valueOf(autoCheckUpdate));
     }
 
+    public boolean isUseTray() {
+        return setting.getBool("useTray", "setting.normal", true);
+    }
+
+    public void setUseTray(boolean useTray) {
+        setting.put("setting.normal", "useTray", String.valueOf(useTray));
+    }
+
     public long getPushTotal() {
         return setting.getLong("pushTotal", "setting.normal", 0L);
     }

From 1fc488c6aaeee80bf0ff6bce21e48e98d106e1e0 Mon Sep 17 00:00:00 2001
From: duoduo 
Date: Sat, 28 Sep 2019 13:18:28 +0800
Subject: [PATCH 15/16] release:v_4.0.0_190928

---
 src/main/java/com/fangxuele/tool/push/ui/Init.java   |  2 +-
 .../java/com/fangxuele/tool/push/ui/UiConsts.java    |  2 +-
 src/main/resources/version_summary.json              | 12 +++++++++---
 3 files changed, 11 insertions(+), 5 deletions(-)

diff --git a/src/main/java/com/fangxuele/tool/push/ui/Init.java b/src/main/java/com/fangxuele/tool/push/ui/Init.java
index 477319b3..607a8c45 100644
--- a/src/main/java/com/fangxuele/tool/push/ui/Init.java
+++ b/src/main/java/com/fangxuele/tool/push/ui/Init.java
@@ -167,7 +167,7 @@ public static void initTray() {
                 popupMenu.setFont(App.mainFrame.getContentPane().getFont());
 
                 MenuItem openItem = new MenuItem("WePush");
-                MenuItem exitItem = new MenuItem("Quit");
+                MenuItem exitItem = new MenuItem("退出");
 
                 openItem.addActionListener(e -> {
                     App.mainFrame.setExtendedState(JFrame.NORMAL);
diff --git a/src/main/java/com/fangxuele/tool/push/ui/UiConsts.java b/src/main/java/com/fangxuele/tool/push/ui/UiConsts.java
index c73e5c3b..5775fa5a 100644
--- a/src/main/java/com/fangxuele/tool/push/ui/UiConsts.java
+++ b/src/main/java/com/fangxuele/tool/push/ui/UiConsts.java
@@ -16,7 +16,7 @@ public class UiConsts {
      * 软件名称,版本
      */
     public final static String APP_NAME = "WePush";
-    public final static String APP_VERSION = "v_3.9.0_190915";
+    public final static String APP_VERSION = "v_4.0.0_190928";
 
     /**
      * Logo-1024*1024
diff --git a/src/main/resources/version_summary.json b/src/main/resources/version_summary.json
index 1e9011ee..c79bfd87 100644
--- a/src/main/resources/version_summary.json
+++ b/src/main/resources/version_summary.json
@@ -1,5 +1,5 @@
 {
-  "currentVersion": "v_3.9.0_190915",
+  "currentVersion": "v_4.0.0_190928",
   "versionIndex": {
     "v_1.1.0_170701": "0",
     "v_1.2.0_170831": "1",
@@ -36,7 +36,8 @@
     "v_3.6.3_190825": "32",
     "v_3.7.0_190904": "33",
     "v_3.8.0_190909": "34",
-    "v_3.9.0_190915": "35"
+    "v_3.9.0_190915": "35",
+    "v_4.0.0_190928": "36"
   },
   "versionDetailList": [
     {
@@ -217,7 +218,12 @@
     {
       "version": "v_3.9.0_190915",
       "title": "新增支持华为云短信和百度云短信",
-      "log": "● feature:新增支持华为云短信消息类型\n● feature:新增支持百度云短信消息类型\n● bug fix:修复导入成员异常时按钮状态不正确的问题\n"
+      "log": "● feature:新增支持又拍云短信消息类型\n● feature:新增支持七牛云短信消息类型\n● bug fix:修复导入成员异常时按钮状态不正确的问题\n"
+    },
+    {
+      "version": "v_4.0.0_190928",
+      "title": "新增支持又拍云短信和七牛云短信",
+      "log": "● feature:新增支持华为云短信消息类型\n● feature:新增支持百度云短信消息类型\n● optimization:微信公众号消息前置校验优化\n● feature:增加系统托盘(不喜欢可在设置中关闭))\n"
     }
   ]
 }
\ No newline at end of file

From fb68c588e437817dab61e20cd54bc1f5a55f96fe Mon Sep 17 00:00:00 2001
From: duoduo 
Date: Sat, 28 Sep 2019 13:27:17 +0800
Subject: [PATCH 16/16] release:v_4.0.0_190928

---
 download.md | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/download.md b/download.md
index 15090877..e1bbdf8a 100644
--- a/download.md
+++ b/download.md
@@ -3,6 +3,7 @@
 
Windows +[WePush-v4.0.0_190928-x64-Setup.exe](http://download.zhoubochina.com/exe/WePush-v4.0.0_190928-x64-Setup.exe) [WePush-v3.9.0_190915-x64-Setup.exe](http://download.zhoubochina.com/exe/WePush-v3.9.0_190915-x64-Setup.exe) [WePush-v3.8.0_190909-x64-Setup.exe](http://download.zhoubochina.com/exe/WePush-v3.8.0_190909-x64-Setup.exe) [WePush-v3.7.0_190904-x64-Setup.exe](http://download.zhoubochina.com/exe/WePush-v3.7.0_190904-x64-Setup.exe) @@ -111,6 +112,7 @@
Linux +[v4.0.0_190928](http://download.zhoubochina.com/linux/WePush-4.0.0.zip) [v3.9.0_190915](http://download.zhoubochina.com/linux/WePush-3.9.0.zip) [v3.8.0_190909](http://download.zhoubochina.com/linux/WePush-3.8.0.zip) [v3.7.0_190904](http://download.zhoubochina.com/linux/WePush-3.7.0.zip)