diff --git a/.travis.yml b/.travis.yml index 1e697370484429ca3a689370c5ff50a6e1a2180d..08bc63950a115c92cf6e5489dc116a4400fc2d89 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,13 +2,10 @@ language: java before_install: - mvn install:install-file -Dfile=./lib/antlr-2.7.4.jar -DgroupId=net.sourceforge.cpdetector -DartifactId=antlr -Dpackaging=jar -Dversion=2.7.4 -DgeneratePom=true -DcreateChecksum=true - - mvn install:install-file -Dfile=./lib/beautyeye_lnf.jar -DgroupId=com.beautyeye -DartifactId=beautyeye-lnf -Dpackaging=jar -Dversion=1.0 -DgeneratePom=true -DcreateChecksum=true - mvn install:install-file -Dfile=./lib/chardet-1.0.jar -DgroupId=net.sourceforge.cpdetector -DartifactId=chardet -Dpackaging=jar -Dversion=1.0.0 -DgeneratePom=true -DcreateChecksum=true - mvn install:install-file -Dfile=./lib/cpdetector_1.0.10.jar -DgroupId=net.sourceforge.cpdetector -DartifactId=cpdetector -Dpackaging=jar -Dversion=1.0.10 -DgeneratePom=true -DcreateChecksum=true - - mvn install:install-file -Dfile=./lib/darcula.jar -DgroupId=com.darcula -DartifactId=darcula-lnf -Dpackaging=jar -Dversion=1.0 -DgeneratePom=true -DcreateChecksum=true - mvn install:install-file -Dfile=./lib/jargs-1.0.jar -DgroupId=net.sourceforge.cpdetector -DartifactId=jargs -Dpackaging=jar -Dversion=1.0.0 -DgeneratePom=true -DcreateChecksum=true - mvn install:install-file -Dfile=./lib/taobao-sdk-java-auto.jar -DgroupId=com.taobao -DartifactId=taobao-sdk-java-auto -Dpackaging=jar -Dversion=1.0.0 -DgeneratePom=true -DcreateChecksum=true - - mvn install:install-file -Dfile=./lib/weblaf-1.29.jar -DgroupId=com.weblaf -DartifactId=weblaf-lnf -Dpackaging=jar -Dversion=1.2.9 -DgeneratePom=true -DcreateChecksum=true jdk: - openjdk8 diff --git a/lib/beautyeye_lnf.jar b/lib/beautyeye_lnf.jar deleted file mode 100644 index e4f81936b81c166a52860a62e85e91ce3eab6219..0000000000000000000000000000000000000000 Binary files a/lib/beautyeye_lnf.jar and /dev/null differ diff --git a/lib/darcula.jar b/lib/darcula.jar deleted file mode 100644 index 8178abd82f1251e0892c2ee1ba14914a57e5a65b..0000000000000000000000000000000000000000 Binary files a/lib/darcula.jar and /dev/null differ diff --git a/lib/weblaf-1.29.jar b/lib/weblaf-1.29.jar deleted file mode 100644 index 55e9f9ba563fb371df163d5dbb6f0d222f739a35..0000000000000000000000000000000000000000 Binary files a/lib/weblaf-1.29.jar and /dev/null differ diff --git a/pom.xml b/pom.xml index 1973bde000d748a04e6a45cda323c6205080cecd..61152e4a8bd2f2389a5c42797eee7e1c2edb34f1 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ com.fangxuele.tool WePush - 5.0.1 + 5.0.2 jar WePush @@ -37,8 +37,8 @@ 1.2.7 2.3 1.18.20 - 3.5.7 - 3.36.0.3 + 3.5.13 + 3.42.0.1 4.13.1 4.1.4 3.4.5 @@ -51,6 +51,7 @@ 3.2 3.2 2.6.0 + 3.1.847 @@ -425,6 +426,12 @@ + + com.tencentcloudapi + tencentcloud-sdk-java + ${tencentcloud-sdk-java.version} + + @@ -440,36 +447,36 @@ true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + bundling-for-windows + package + + package + + + windows + true + jdk.crypto.ec,jdk.charsets + + + + + true + true + true + + + installForAllUsers + true + false + false + + compiler:Default.isl + + + + + @@ -483,20 +490,20 @@ - - bundling-for-mac - package - - package - - - mac - true - jdk.crypto.ec,jdk.charsets - false - - - + + + + + + + + + + + + + + @@ -505,36 +512,6 @@ maven-install-plugin 2.5.2 - - install-beautyeye - clean - - lib/beautyeye_lnf.jar - com.beautyeye - beautyeye-lnf - 1.0 - jar - true - - - install-file - - - - install-darcula - clean - - lib/darcula.jar - com.darcula - darcula-lnf - 1.0 - jar - true - - - install-file - - install-taobao-sdk-auto clean diff --git a/src/main/java/com/fangxuele/tool/push/bean/account/TxYun3AccountConfig.java b/src/main/java/com/fangxuele/tool/push/bean/account/TxYun3AccountConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..983416d687ac7dd673cdfd31c0df6458fad6aea8 --- /dev/null +++ b/src/main/java/com/fangxuele/tool/push/bean/account/TxYun3AccountConfig.java @@ -0,0 +1,16 @@ +package com.fangxuele.tool.push.bean.account; + +import lombok.Data; + +/** + * 腾讯云3.0账号配置 + */ +@Data +public class TxYun3AccountConfig { + private String secretId; + private String secretKey; + private String endPoint; + private String region; + private String sign; + private String sdkAppId; +} diff --git a/src/main/java/com/fangxuele/tool/push/bean/account/WxCpAccountConfig.java b/src/main/java/com/fangxuele/tool/push/bean/account/WxCpAccountConfig.java index 51414827fac26a58b4de218f07f98d1922c4c2d9..452a046d171baf4a12b3d275eac4cf039d0fba14 100644 --- a/src/main/java/com/fangxuele/tool/push/bean/account/WxCpAccountConfig.java +++ b/src/main/java/com/fangxuele/tool/push/bean/account/WxCpAccountConfig.java @@ -11,4 +11,6 @@ public class WxCpAccountConfig { private String appName; private String agentId; private String secret; + private Boolean privateDep; + private String baseApiUrl; } 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 90d869f425848569b64e5f1ee36201bef2b87839..56dec05012ea7d2c49c6ba17741f03215a0ffdcd 100644 --- a/src/main/java/com/fangxuele/tool/push/logic/MessageTypeEnum.java +++ b/src/main/java/com/fangxuele/tool/push/logic/MessageTypeEnum.java @@ -30,8 +30,7 @@ public enum MessageTypeEnum { WX_UNIFORM_MESSAGE(17, "小程序-统一服务消息"), MA_SUBSCRIBE(18, "小程序-订阅消息"), MP_SUBSCRIBE(19, "公众号-订阅通知"), - WX_MP(20, "微信公众号"), - WX_MA(21, "微信小程序"); + TX_YUN_3(20, "腾讯云短信3.0"); private int code; @@ -55,6 +54,7 @@ public enum MessageTypeEnum { public static final int WX_UNIFORM_MESSAGE_CODE = 17; public static final int MA_SUBSCRIBE_CODE = 18; public static final int MP_SUBSCRIBE_CODE = 19; + public static final int TX_YUN_3_CODE = 20; MessageTypeEnum(int code, String name) { this.code = code; @@ -123,10 +123,7 @@ public enum MessageTypeEnum { name = MP_SUBSCRIBE.name; break; case 20: - name = WX_MP.name; - break; - case 21: - name = WX_MA.name; + name = TX_YUN_3.name; break; default: name = ""; 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 71e01f4985d9c3ce5a7a058140754f1b96721640..82a8081b0a54493c2b4dc19bcdded1dc90b4f467 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 @@ -37,6 +37,9 @@ public class MsgMakerFactory { case MessageTypeEnum.TX_YUN_CODE: iMsgMaker = new TxYunMsgMaker(tMsg); break; + case MessageTypeEnum.TX_YUN_3_CODE: + iMsgMaker = new TxYun3MsgMaker(tMsg); + break; case MessageTypeEnum.HW_YUN_CODE: iMsgMaker = new HwYunMsgMaker(tMsg); break; diff --git a/src/main/java/com/fangxuele/tool/push/logic/msgmaker/TxYun3MsgMaker.java b/src/main/java/com/fangxuele/tool/push/logic/msgmaker/TxYun3MsgMaker.java new file mode 100644 index 0000000000000000000000000000000000000000..d1d1e67980d2a52d5831f79f3a5936d5099f1019 --- /dev/null +++ b/src/main/java/com/fangxuele/tool/push/logic/msgmaker/TxYun3MsgMaker.java @@ -0,0 +1,54 @@ +package com.fangxuele.tool.push.logic.msgmaker; + +import com.alibaba.fastjson.JSON; +import com.fangxuele.tool.push.bean.TemplateData; +import com.fangxuele.tool.push.domain.TMsg; +import com.fangxuele.tool.push.domain.TMsgSms; +import com.fangxuele.tool.push.util.TemplateUtil; +import lombok.Getter; +import org.apache.velocity.VelocityContext; + +import java.util.ArrayList; +import java.util.List; + +/** + *
+ * 腾讯云3.0模板短信加工器
+ * 
+ * + * @author Zhou Bo + * @since 2023/9/4. + */ +@Getter +public class TxYun3MsgMaker extends BaseMsgMaker implements IMsgMaker { + + private String templateId; + + private List paramList; + + public TxYun3MsgMaker(TMsg tMsg) { + TMsgSms tMsgSms = JSON.parseObject(tMsg.getContent(), TMsgSms.class); + this.templateId = tMsgSms.getTemplateId(); + paramList = new ArrayList<>(); + for (TemplateData templateData : tMsgSms.getTemplateDataList()) { + paramList.add(templateData.getValue()); + } + } + + /** + * 组织腾讯云短信消息 + * + * @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 68ad200d560d821a52516c6e7659383b164538fb..ac95b7fe12f0a2df6c66c98b34968424fc108593 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 @@ -42,6 +42,9 @@ public class MsgSenderFactory { case MessageTypeEnum.TX_YUN_CODE: iMsgSender = new TxYunMsgSender(msgId, dryRun); break; + case MessageTypeEnum.TX_YUN_3_CODE: + iMsgSender = new TxYun3MsgSender(msgId, dryRun); + break; case MessageTypeEnum.HW_YUN_CODE: iMsgSender = new HwYunMsgSender(msgId, dryRun); break; diff --git a/src/main/java/com/fangxuele/tool/push/logic/msgsender/TxYun3MsgSender.java b/src/main/java/com/fangxuele/tool/push/logic/msgsender/TxYun3MsgSender.java new file mode 100644 index 0000000000000000000000000000000000000000..4cf9829bfcfbe2625db768841539d49cac0c3b30 --- /dev/null +++ b/src/main/java/com/fangxuele/tool/push/logic/msgsender/TxYun3MsgSender.java @@ -0,0 +1,193 @@ +package com.fangxuele.tool.push.logic.msgsender; + +import cn.hutool.json.JSONUtil; +import com.alibaba.fastjson.JSON; +import com.fangxuele.tool.push.bean.account.TxYun3AccountConfig; +import com.fangxuele.tool.push.dao.TAccountMapper; +import com.fangxuele.tool.push.dao.TMsgMapper; +import com.fangxuele.tool.push.domain.TAccount; +import com.fangxuele.tool.push.domain.TMsg; +import com.fangxuele.tool.push.logic.msgmaker.TxYun3MsgMaker; +import com.fangxuele.tool.push.util.MybatisUtil; +import com.tencentcloudapi.common.Credential; +import com.tencentcloudapi.common.profile.ClientProfile; +import com.tencentcloudapi.common.profile.HttpProfile; +import com.tencentcloudapi.sms.v20210111.SmsClient; +import com.tencentcloudapi.sms.v20210111.models.SendSmsRequest; +import com.tencentcloudapi.sms.v20210111.models.SendSmsResponse; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.exception.ExceptionUtils; + +import java.util.HashMap; +import java.util.Map; + +/** + *
+ * 腾讯云3.0模板短信发送器
+ * 
+ * + * @author RememBerBer + * @since 2023/9/4. + */ +@Slf4j +public class TxYun3MsgSender implements IMsgSender { + /** + * 腾讯云短信sender + */ + private SmsClient smsClient; + + private TxYun3MsgMaker txYun3MsgMaker; + + private static TAccountMapper accountMapper = MybatisUtil.getSqlSession().getMapper(TAccountMapper.class); + private static TMsgMapper msgMapper = MybatisUtil.getSqlSession().getMapper(TMsgMapper.class); + + private Integer dryRun; + + private static Map smsClientMap = new HashMap<>(); + + private TxYun3AccountConfig txYun3AccountConfig; + + + public TxYun3MsgSender(Integer msgId, Integer dryRun) { + TMsg tMsg = msgMapper.selectByPrimaryKey(msgId); + txYun3MsgMaker = new TxYun3MsgMaker(tMsg); + smsClient = getTxYunSender(tMsg.getAccountId()); + this.dryRun = dryRun; + + TAccount tAccount = accountMapper.selectByPrimaryKey(tMsg.getAccountId()); + String accountConfig = tAccount.getAccountConfig(); + txYun3AccountConfig = JSON.parseObject(accountConfig, TxYun3AccountConfig.class); + } + + public static void removeAccount(Integer account1Id) { + smsClientMap.remove(account1Id); + } + + @Override + public SendResult send(String[] msgData) { + SendResult sendResult = new SendResult(); + try { + String templateId = txYun3MsgMaker.getTemplateId(); + String smsSign = txYun3AccountConfig.getSign(); + String[] params = txYun3MsgMaker.makeMsg(msgData); + String telNum = msgData[0]; + if (dryRun == 1) { + sendResult.setSuccess(true); + return sendResult; + } else { + SendSmsRequest req = new SendSmsRequest(); + + /* 填充请求参数,这里request对象的成员变量即对应接口的入参 + * 你可以通过官网接口文档或跳转到request对象的定义处查看请求参数的定义 + * 基本类型的设置: + * 帮助链接: + * 短信控制台: https://console.cloud.tencent.com/smsv2 + * 腾讯云短信小助手: https://cloud.tencent.com/document/product/382/3773#.E6.8A.80.E6.9C.AF.E4.BA.A4.E6.B5.81 */ + + /* 短信应用ID: 短信SdkAppId在 [短信控制台] 添加应用后生成的实际SdkAppId,示例如1400006666 */ + // 应用 ID 可前往 [短信控制台](https://console.cloud.tencent.com/smsv2/app-manage) 查看 + String sdkAppId = txYun3AccountConfig.getSdkAppId(); + req.setSmsSdkAppId(sdkAppId); + + /* 短信签名内容: 使用 UTF-8 编码,必须填写已审核通过的签名 */ + // 签名信息可前往 [国内短信](https://console.cloud.tencent.com/smsv2/csms-sign) 或 [国际/港澳台短信](https://console.cloud.tencent.com/smsv2/isms-sign) 的签名管理查看 + req.setSignName(smsSign); + + /* 模板 ID: 必须填写已审核通过的模板 ID */ + // 模板 ID 可前往 [国内短信](https://console.cloud.tencent.com/smsv2/csms-template) 或 [国际/港澳台短信](https://console.cloud.tencent.com/smsv2/isms-template) 的正文模板管理查看 + req.setTemplateId(templateId); + + /* 模板参数: 模板参数的个数需要与 TemplateId 对应模板的变量个数保持一致,若无模板参数,则设置为空 */ + String[] templateParamSet = params; + req.setTemplateParamSet(templateParamSet); + + /* 下发手机号码,采用 E.164 标准,+[国家或地区码][手机号] + * 示例如:+8613711112222, 其中前面有一个+号 ,86为国家码,13711112222为手机号,最多不要超过200个手机号 */ + String[] phoneNumberSet = {telNum}; + req.setPhoneNumberSet(phoneNumberSet); + + /* 用户的 session 内容(无需要可忽略): 可以携带用户侧 ID 等上下文信息,server 会原样返回 */ +// String sessionContext = ""; +// req.setSessionContext(sessionContext); + + /* 短信码号扩展号(无需要可忽略): 默认未开通,如需开通请联系 [腾讯云短信小助手] */ +// String extendCode = ""; +// req.setExtendCode(extendCode); + + /* 国内短信无需填写该项;国际/港澳台短信已申请独立 SenderId 需要填写该字段,默认使用公共 SenderId,无需填写该字段。注:月度使用量达到指定量级可申请独立 SenderId 使用,详情请联系 [腾讯云短信小助手](https://cloud.tencent.com/document/product/382/3773#.E6.8A.80.E6.9C.AF.E4.BA.A4.E6.B5.81)。*/ +// String senderid = ""; +// req.setSenderId(senderid); + + /* 通过 client 对象调用 SendSms 方法发起请求。注意请求方法名与请求对象是对应的 + * 返回的 res 是一个 SendSmsResponse 类的实例,与请求对象对应 */ + SendSmsResponse res = smsClient.SendSms(req); + + if (res.getSendStatusSet()[0].getCode().equals("Ok")) { + sendResult.setSuccess(true); + } else { + sendResult.setSuccess(false); + sendResult.setInfo(JSONUtil.toJsonStr(res)); + } + } + } catch (Exception e) { + sendResult.setSuccess(false); + sendResult.setInfo(e.getMessage()); + log.error(ExceptionUtils.getStackTrace(e)); + } + + return sendResult; + } + + @Override + public SendResult asyncSend(String[] msgData) { + return null; + } + + public SmsClient getTxYunSender(Integer accountId) { + if (smsClientMap.containsKey(accountId)) { + return smsClientMap.get(accountId); + } else { + TAccount tAccount = accountMapper.selectByPrimaryKey(accountId); + String accountConfig = tAccount.getAccountConfig(); + TxYun3AccountConfig txYun3AccountConfig = JSON.parseObject(accountConfig, TxYun3AccountConfig.class); + + /* 必要步骤: + * 实例化一个认证对象,入参需要传入腾讯云账户密钥对secretId,secretKey。 + * 这里采用的是从环境变量读取的方式,需要在环境变量中先设置这两个值。 + * 你也可以直接在代码中写死密钥对,但是小心不要将代码复制、上传或者分享给他人, + * 以免泄露密钥对危及你的财产安全。 + * SecretId、SecretKey 查询: https://console.cloud.tencent.com/cam/capi */ + Credential cred = new Credential(txYun3AccountConfig.getSecretId(), txYun3AccountConfig.getSecretKey()); + + + // 实例化一个http选项,可选,没有特殊需求可以跳过 + HttpProfile httpProfile = new HttpProfile(); + // 设置代理(无需要直接忽略) + // httpProfile.setProxyHost("真实代理ip"); + // httpProfile.setProxyPort(真实代理端口); + /* SDK默认使用POST方法。 + * 如果你一定要使用GET方法,可以在这里设置。GET方法无法处理一些较大的请求 */ + httpProfile.setReqMethod("POST"); + /* SDK有默认的超时时间,非必要请不要进行调整 + * 如有需要请在代码中查阅以获取最新的默认值 */ +// httpProfile.setConnTimeout(60); + /* 指定接入地域域名,默认就近地域接入域名为 sms.tencentcloudapi.com ,也支持指定地域域名访问,例如广州地域的域名为 sms.ap-guangzhou.tencentcloudapi.com */ + httpProfile.setEndpoint(txYun3AccountConfig.getEndPoint()); + + + /* 非必要步骤: + * 实例化一个客户端配置对象,可以指定超时时间等配置 */ + ClientProfile clientProfile = new ClientProfile(); + /* SDK默认用TC3-HMAC-SHA256进行签名 + * 非必要请不要修改这个字段 */ +// clientProfile.setSignMethod("HmacSHA256"); + clientProfile.setHttpProfile(httpProfile); + /* 实例化要请求产品(以sms为例)的client对象 + * 第二个参数是地域信息,可以直接填写字符串ap-guangzhou,支持的地域列表参考 https://cloud.tencent.com/document/api/382/52071#.E5.9C.B0.E5.9F.9F.E5.88.97.E8.A1.A8 */ + SmsClient client = new SmsClient(cred, txYun3AccountConfig.getRegion()); + + smsClientMap.put(accountId, client); + return client; + } + } +} diff --git a/src/main/java/com/fangxuele/tool/push/logic/msgsender/WxCpMsgSender.java b/src/main/java/com/fangxuele/tool/push/logic/msgsender/WxCpMsgSender.java index 80f2180c6ae72ef28d28b9504853b8dc6443b60e..36e9143867e52c32ab5e47de668613cf995d99e7 100644 --- a/src/main/java/com/fangxuele/tool/push/logic/msgsender/WxCpMsgSender.java +++ b/src/main/java/com/fangxuele/tool/push/logic/msgsender/WxCpMsgSender.java @@ -121,6 +121,10 @@ public class WxCpMsgSender implements IMsgSender { // clientBuilder.setUserAgent(..) configStorage.setApacheHttpClientBuilder(clientBuilder); + if (wxCpAccountConfig.getPrivateDep()) { + configStorage.setBaseApiUrl(wxCpAccountConfig.getBaseApiUrl()); + } + WxCpService wxCpService = new WxCpServiceApacheHttpClientImpl(); wxCpService.setWxCpConfigStorage(configStorage); 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 e8ddb08883b371b628c80077154d1fe4d0873a31..331537489ed48fd3ff2b7a96ef933654d9febd46 100644 --- a/src/main/java/com/fangxuele/tool/push/ui/UiConsts.java +++ b/src/main/java/com/fangxuele/tool/push/ui/UiConsts.java @@ -19,7 +19,7 @@ public class UiConsts { * 软件名称,版本 */ public final static String APP_NAME = "WePush"; - public final static String APP_VERSION = "v_5.0.1"; + public final static String APP_VERSION = "v_5.0.2"; public static final int TABLE_ROW_HEIGHT = 30; diff --git a/src/main/java/com/fangxuele/tool/push/ui/dialog/NewTaskDialog.java b/src/main/java/com/fangxuele/tool/push/ui/dialog/NewTaskDialog.java index b785ab6a390892f254c122062e1141bdf80f9e92..dbb6143414c19046baa4224cd39b25a87268144c 100644 --- a/src/main/java/com/fangxuele/tool/push/ui/dialog/NewTaskDialog.java +++ b/src/main/java/com/fangxuele/tool/push/ui/dialog/NewTaskDialog.java @@ -412,6 +412,10 @@ public class NewTaskDialog extends JDialog { msgTypeMapReverse.put(MessageTypeEnum.TX_YUN_CODE, MessageTypeEnum.getName(MessageTypeEnum.TX_YUN)); this.msgTypeComboBox.addItem(MessageTypeEnum.getName(MessageTypeEnum.TX_YUN)); + msgTypeMap.put(MessageTypeEnum.getName(MessageTypeEnum.TX_YUN_3), MessageTypeEnum.TX_YUN_3_CODE); + msgTypeMapReverse.put(MessageTypeEnum.TX_YUN_3_CODE, MessageTypeEnum.getName(MessageTypeEnum.TX_YUN_3)); + this.msgTypeComboBox.addItem(MessageTypeEnum.getName(MessageTypeEnum.TX_YUN_3)); + msgTypeMap.put(MessageTypeEnum.getName(MessageTypeEnum.HW_YUN), MessageTypeEnum.HW_YUN_CODE); msgTypeMapReverse.put(MessageTypeEnum.HW_YUN_CODE, MessageTypeEnum.getName(MessageTypeEnum.HW_YUN)); this.msgTypeComboBox.addItem(MessageTypeEnum.getName(MessageTypeEnum.HW_YUN)); 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 bccb39bb7c48f47f67612b83eed4a4231796fe55..67f30761e3db2b1a3fd85080160489d58ca3e367 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 @@ -106,6 +106,9 @@ public class MessageEditForm { case MessageTypeEnum.TX_YUN_CODE: messageEditForm.getMsgEditorPanel().add(TxYunMsgForm.getInstance().getTemplateMsgPanel(), gridConstraintsRow0); break; + case MessageTypeEnum.TX_YUN_3_CODE: + messageEditForm.getMsgEditorPanel().add(TxYun3MsgForm.getInstance().getTemplateMsgPanel(), gridConstraintsRow0); + break; case MessageTypeEnum.QI_NIU_YUN_CODE: messageEditForm.getMsgEditorPanel().add(QiNiuYunMsgForm.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 d25928c8397f80c07d96f821e9a2b69da215c200..61978af88fd10a2573e9445d78241b59039b5cba 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 @@ -3,7 +3,7 @@ - + @@ -19,7 +19,7 @@ - + @@ -95,9 +95,17 @@ + + + + + + + + - + @@ -105,7 +113,7 @@ - + @@ -114,7 +122,7 @@ - + @@ -123,7 +131,7 @@ - + @@ -132,7 +140,7 @@ - + @@ -141,7 +149,7 @@ - + @@ -158,7 +166,7 @@ - + @@ -199,7 +207,7 @@ - + @@ -208,7 +216,7 @@ - + @@ -217,7 +225,7 @@ - + @@ -226,7 +234,7 @@ - + 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 902f67c2a457bc19fcb5c7587baaa521ca499470..9d09bcebe2fc2b19915697f204e88860bd32fb2a 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 @@ -49,6 +49,7 @@ public class MessageTypeForm { private JRadioButton wxUniformMessageRadioButton; private JRadioButton maSubscribeRadioButton; private JRadioButton mpSubscribeRadioButton; + private JRadioButton txYun3RadioButton; private static MessageTypeForm messageTypeForm; @@ -129,6 +130,9 @@ public class MessageTypeForm { case MessageTypeEnum.BD_YUN_CODE: messageTypeForm.getBdYunRadioButton().setSelected(true); break; + case MessageTypeEnum.TX_YUN_3_CODE: + messageTypeForm.getTxYun3RadioButton().setSelected(true); + break; default: } @@ -193,7 +197,7 @@ public class MessageTypeForm { messageTypePanel.add(messageTypeScrollPane, 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)); messageTypeScrollPane.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEmptyBorder(), null, TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION, null, null)); msgTypeListPanel = new JPanel(); - msgTypeListPanel.setLayout(new GridLayoutManager(23, 3, new Insets(10, 0, 0, 0), -1, -1)); + msgTypeListPanel.setLayout(new GridLayoutManager(24, 3, new Insets(10, 0, 0, 0), -1, -1)); msgTypeListPanel.setAutoscrolls(true); messageTypeScrollPane.setViewportView(msgTypeListPanel); mpTemplateRadioButton = new JRadioButton(); @@ -224,36 +228,39 @@ public class MessageTypeForm { txYunRadioButton = new JRadioButton(); txYunRadioButton.setText("腾讯云短信"); msgTypeListPanel.add(txYunRadioButton, 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)); + txYun3RadioButton = new JRadioButton(); + txYun3RadioButton.setText("腾讯云短信3.0"); + msgTypeListPanel.add(txYun3RadioButton, 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)); yunPianRadioButton = new JRadioButton(); yunPianRadioButton.setText("云片网短信"); - msgTypeListPanel.add(yunPianRadioButton, 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)); + msgTypeListPanel.add(yunPianRadioButton, new GridConstraints(15, 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(18, 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(网易云信短信RadioButton, new GridConstraints(19, 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(19, 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(榛子云短信RadioButton, new GridConstraints(20, 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)); luosimao短信RadioButton = new JRadioButton(); luosimao短信RadioButton.setEnabled(false); luosimao短信RadioButton.setText("Luosimao短信"); - msgTypeListPanel.add(luosimao短信RadioButton, new GridConstraints(20, 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(luosimao短信RadioButton, new GridConstraints(21, 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(21, 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(极光短信RadioButton, new GridConstraints(22, 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(22, 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(极光推送RadioButton, new GridConstraints(23, 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)); kefuPriorityTipsLabel = new JLabel(); kefuPriorityTipsLabel.setText(""); msgTypeListPanel.add(kefuPriorityTipsLabel, new GridConstraints(6, 1, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); eMailRadioButton = new JRadioButton(); eMailRadioButton.setEnabled(true); eMailRadioButton.setText("E-Mail(BETA)"); - msgTypeListPanel.add(eMailRadioButton, new GridConstraints(17, 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(18, 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("企业号/企业微信"); @@ -271,19 +278,19 @@ public class MessageTypeForm { hwYunRadioButton = new JRadioButton(); hwYunRadioButton.setEnabled(true); hwYunRadioButton.setText("华为云短信(BETA)"); - msgTypeListPanel.add(hwYunRadioButton, 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(hwYunRadioButton, 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)); bdYunRadioButton = new JRadioButton(); bdYunRadioButton.setEnabled(true); bdYunRadioButton.setText("百度云短信(BETA)"); - msgTypeListPanel.add(bdYunRadioButton, 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(bdYunRadioButton, 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)); upYunRadioButton = new JRadioButton(); upYunRadioButton.setEnabled(true); upYunRadioButton.setText("又拍云短信(BETA)"); - msgTypeListPanel.add(upYunRadioButton, new GridConstraints(15, 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(upYunRadioButton, new GridConstraints(16, 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(16, 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(qiniuRadioButton, new GridConstraints(17, 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)); wxUniformMessageRadioButton = new JRadioButton(); wxUniformMessageRadioButton.setText("小程序-统一服务消息(BETA)"); msgTypeListPanel.add(wxUniformMessageRadioButton, new GridConstraints(7, 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)); diff --git a/src/main/java/com/fangxuele/tool/push/ui/form/account/AccountFormFactory.java b/src/main/java/com/fangxuele/tool/push/ui/form/account/AccountFormFactory.java index 0de38ce0f112e89cf67798b4eefbb7c0eb535e81..dbc2ad520572ef2ce48964d73953c36ce699f56f 100644 --- a/src/main/java/com/fangxuele/tool/push/ui/form/account/AccountFormFactory.java +++ b/src/main/java/com/fangxuele/tool/push/ui/form/account/AccountFormFactory.java @@ -38,6 +38,9 @@ public class AccountFormFactory { case MessageTypeEnum.TX_YUN_CODE: iAccountForm = TxYunAccountForm.getInstance(); break; + case MessageTypeEnum.TX_YUN_3_CODE: + iAccountForm = TxYun3AccountForm.getInstance(); + break; case MessageTypeEnum.HW_YUN_CODE: iAccountForm = HwYunAccountForm.getInstance(); break; diff --git a/src/main/java/com/fangxuele/tool/push/ui/form/account/TxYun3AccountForm.form b/src/main/java/com/fangxuele/tool/push/ui/form/account/TxYun3AccountForm.form new file mode 100644 index 0000000000000000000000000000000000000000..3b6e718834ab44d238d9fc0d3ed666be18aeea0b --- /dev/null +++ b/src/main/java/com/fangxuele/tool/push/ui/form/account/TxYun3AccountForm.form @@ -0,0 +1,131 @@ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/src/main/java/com/fangxuele/tool/push/ui/form/account/TxYun3AccountForm.java b/src/main/java/com/fangxuele/tool/push/ui/form/account/TxYun3AccountForm.java new file mode 100644 index 0000000000000000000000000000000000000000..1b1da0a659c5d9b3acdbf9785c8e274311025aa9 --- /dev/null +++ b/src/main/java/com/fangxuele/tool/push/ui/form/account/TxYun3AccountForm.java @@ -0,0 +1,189 @@ +package com.fangxuele.tool.push.ui.form.account; + +import cn.hutool.json.JSONUtil; +import com.fangxuele.tool.push.App; +import com.fangxuele.tool.push.bean.account.TxYun3AccountConfig; +import com.fangxuele.tool.push.domain.TAccount; +import com.fangxuele.tool.push.logic.msgsender.TxYunMsgSender; +import com.fangxuele.tool.push.ui.form.MainWindow; +import com.fangxuele.tool.push.util.SqliteUtil; +import com.fangxuele.tool.push.util.UIUtil; +import com.fangxuele.tool.push.util.UndoUtil; +import com.intellij.uiDesigner.core.GridConstraints; +import com.intellij.uiDesigner.core.GridLayoutManager; +import com.intellij.uiDesigner.core.Spacer; +import lombok.Getter; +import org.apache.commons.lang3.StringUtils; + +import javax.swing.*; +import java.awt.*; + +@Getter +public class TxYun3AccountForm implements IAccountForm { + private JPanel mainPanel; + private JTextField signTextField; + private JTextField secretIdTextField; + private JTextField secretKeyTextField; + private JTextField endPointTextField; + private JTextField regionTextField; + private JTextField sdkAppIdTextField; + + private static TxYun3AccountForm txYun3AccountForm; + + @Override + public void init(String accountName) { + TxYun3AccountForm instance = getInstance(); + if (StringUtils.isNotEmpty(accountName)) { + TAccount tAccount = accountMapper.selectByMsgTypeAndAccountName(App.config.getMsgType(), accountName); + + TxYun3AccountConfig txYun3AccountConfig = JSONUtil.toBean(tAccount.getAccountConfig(), TxYun3AccountConfig.class); + instance.getSignTextField().setText(txYun3AccountConfig.getSign()); + instance.getSecretIdTextField().setText(txYun3AccountConfig.getSecretId()); + instance.getSecretKeyTextField().setText(txYun3AccountConfig.getSecretKey()); + instance.getEndPointTextField().setText(txYun3AccountConfig.getEndPoint()); + instance.getRegionTextField().setText(txYun3AccountConfig.getRegion()); + instance.getSdkAppIdTextField().setText(txYun3AccountConfig.getSdkAppId()); + } else { + instance.getEndPointTextField().setText("sms.tencentcloudapi.com"); + instance.getRegionTextField().setText("ap-guangzhou"); + } + } + + @Override + public void save(String accountName) { + if (StringUtils.isNotEmpty(accountName)) { + TAccount tAccount = accountMapper.selectByMsgTypeAndAccountName(App.config.getMsgType(), accountName); + TxYun3AccountForm instance = getInstance(); + int msgType = App.config.getMsgType(); + + boolean existSameAccount = false; + + if (tAccount != null) { + existSameAccount = true; + } + + int isCover = JOptionPane.NO_OPTION; + if (existSameAccount) { + // 如果存在,是否覆盖 + isCover = JOptionPane.showConfirmDialog(MainWindow.getInstance().getMessagePanel(), "已经存在同名的账号,\n是否覆盖?", "确认", + JOptionPane.YES_NO_OPTION); + } + + if (!existSameAccount || isCover == JOptionPane.YES_OPTION) { + + String now = SqliteUtil.nowDateForSqlite(); + + TAccount tAccount1 = new TAccount(); + tAccount1.setMsgType(msgType); + tAccount1.setAccountName(accountName); + + TxYun3AccountConfig txYun3AccountConfig = new TxYun3AccountConfig(); + txYun3AccountConfig.setSign(instance.getSignTextField().getText()); + txYun3AccountConfig.setSecretId(instance.getSecretIdTextField().getText()); + txYun3AccountConfig.setSecretKey(instance.getSecretKeyTextField().getText()); + txYun3AccountConfig.setEndPoint(instance.getEndPointTextField().getText()); + txYun3AccountConfig.setRegion(instance.getRegionTextField().getText()); + txYun3AccountConfig.setSdkAppId(instance.getSdkAppIdTextField().getText()); + + tAccount1.setAccountConfig(JSONUtil.toJsonStr(txYun3AccountConfig)); + + tAccount1.setModifiedTime(now); + + if (existSameAccount) { + accountMapper.updateByMsgTypeAndAccountName(tAccount1); + TxYunMsgSender.removeAccount(tAccount1.getId()); + } else { + tAccount1.setCreateTime(now); + accountMapper.insertSelective(tAccount1); + } + + JOptionPane.showMessageDialog(MainWindow.getInstance().getMainPanel(), "保存成功!", "成功", + JOptionPane.INFORMATION_MESSAGE); + } + + } + } + + @Override + public void clear() { + UIUtil.clearForm(getInstance()); + } + + @Override + public JPanel getMainPanel() { + return mainPanel; + } + + public static TxYun3AccountForm getInstance() { + if (txYun3AccountForm == null) { + txYun3AccountForm = new TxYun3AccountForm(); + } + UndoUtil.register(txYun3AccountForm); + return txYun3AccountForm; + } + + { +// 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$$$() { + mainPanel = new JPanel(); + mainPanel.setLayout(new GridLayoutManager(1, 1, new Insets(10, 5, 0, 0), -1, -1)); + final JPanel panel1 = new JPanel(); + panel1.setLayout(new GridLayoutManager(7, 2, new Insets(0, 0, 0, 0), -1, -1)); + mainPanel.add(panel1, 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)); + final Spacer spacer1 = new Spacer(); + panel1.add(spacer1, new GridConstraints(6, 0, 1, 2, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_VERTICAL, 1, GridConstraints.SIZEPOLICY_WANT_GROW, null, null, null, 0, false)); + final JLabel label1 = new JLabel(); + label1.setText("SecretId"); + panel1.add(label1, 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 label2 = new JLabel(); + label2.setText("SecretKey"); + panel1.add(label2, 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 label3 = new JLabel(); + label3.setText("Endpoint"); + panel1.add(label3, 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 label4 = new JLabel(); + label4.setText("Region"); + panel1.add(label4, new GridConstraints(4, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + final JLabel label5 = new JLabel(); + label5.setText("短信签名"); + panel1.add(label5, new GridConstraints(5, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + signTextField = new JTextField(); + panel1.add(signTextField, new GridConstraints(5, 1, 1, 1, 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)); + secretIdTextField = new JTextField(); + panel1.add(secretIdTextField, new GridConstraints(0, 1, 1, 1, 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)); + secretKeyTextField = new JTextField(); + panel1.add(secretKeyTextField, 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)); + endPointTextField = new JTextField(); + endPointTextField.setText("sms.tencentcloudapi.com"); + panel1.add(endPointTextField, new GridConstraints(3, 1, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_FIXED, null, new Dimension(150, -1), null, 0, false)); + regionTextField = new JTextField(); + regionTextField.setText("ap-guangzhou"); + panel1.add(regionTextField, new GridConstraints(4, 1, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_FIXED, null, new Dimension(150, -1), null, 0, false)); + sdkAppIdTextField = new JTextField(); + sdkAppIdTextField.setText(""); + panel1.add(sdkAppIdTextField, new GridConstraints(2, 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 label6 = new JLabel(); + label6.setText("SdkAppId"); + panel1.add(label6, new GridConstraints(2, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + } + + /** + * @noinspection ALL + */ + public JComponent $$$getRootComponent$$$() { + return mainPanel; + } + +} diff --git a/src/main/java/com/fangxuele/tool/push/ui/form/account/WxCpAccountForm.form b/src/main/java/com/fangxuele/tool/push/ui/form/account/WxCpAccountForm.form index 5bee20bbfd49f9330162387c6c425750abe322e3..a07f2bc1882788c268588243bf26e4328d258ca2 100644 --- a/src/main/java/com/fangxuele/tool/push/ui/form/account/WxCpAccountForm.form +++ b/src/main/java/com/fangxuele/tool/push/ui/form/account/WxCpAccountForm.form @@ -8,7 +8,7 @@ - + @@ -18,7 +18,7 @@ - + @@ -85,6 +85,30 @@
+ + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/src/main/java/com/fangxuele/tool/push/ui/form/account/WxCpAccountForm.java b/src/main/java/com/fangxuele/tool/push/ui/form/account/WxCpAccountForm.java index 4218d1b94f72d0b9a4f4a774bc649cf79467b673..14fd1048751d38df83469bc7058e7a9282fa3821 100644 --- a/src/main/java/com/fangxuele/tool/push/ui/form/account/WxCpAccountForm.java +++ b/src/main/java/com/fangxuele/tool/push/ui/form/account/WxCpAccountForm.java @@ -29,8 +29,11 @@ public class WxCpAccountForm implements IAccountForm { private JTextField appNameTextField; private JTextField agentIdTextField; private JTextField secretTextField; + private JCheckBox privateDepCheckBox; + private JTextField baseApiUrlTextField; + private JLabel baseApiUrlLabel; - private static WxCpAccountForm wxMpAccountForm; + private static WxCpAccountForm wxCpAccountForm; public volatile static WxCpDefaultConfigImpl wxCpConfigStorage; public volatile static WxCpService wxCpService; @@ -46,6 +49,15 @@ public class WxCpAccountForm implements IAccountForm { instance.getAppNameTextField().setText(wxCpAccountConfig.getAppName()); instance.getAgentIdTextField().setText(wxCpAccountConfig.getAgentId()); instance.getSecretTextField().setText(wxCpAccountConfig.getSecret()); + instance.getPrivateDepCheckBox().setSelected(wxCpAccountConfig.getPrivateDep()); + instance.getBaseApiUrlTextField().setText(wxCpAccountConfig.getBaseApiUrl()); + if (wxCpAccountConfig.getPrivateDep()) { + instance.getBaseApiUrlTextField().setVisible(true); + instance.getBaseApiUrlLabel().setVisible(true); + } else { + instance.getBaseApiUrlTextField().setVisible(false); + instance.getBaseApiUrlLabel().setVisible(false); + } } } @@ -82,6 +94,8 @@ public class WxCpAccountForm implements IAccountForm { wxCpAccountConfig.setAppName(instance.getAppNameTextField().getText()); wxCpAccountConfig.setAgentId(instance.getAgentIdTextField().getText()); wxCpAccountConfig.setSecret(instance.getSecretTextField().getText()); + wxCpAccountConfig.setPrivateDep(instance.getPrivateDepCheckBox().isSelected()); + wxCpAccountConfig.setBaseApiUrl(instance.getBaseApiUrlTextField().getText()); tAccount1.setAccountConfig(JSONUtil.toJsonStr(wxCpAccountConfig)); @@ -113,11 +127,20 @@ public class WxCpAccountForm implements IAccountForm { } public static WxCpAccountForm getInstance() { - if (wxMpAccountForm == null) { - wxMpAccountForm = new WxCpAccountForm(); + if (wxCpAccountForm == null) { + wxCpAccountForm = new WxCpAccountForm(); + wxCpAccountForm.getPrivateDepCheckBox().addChangeListener(e -> { + if (wxCpAccountForm.getPrivateDepCheckBox().isSelected()) { + wxCpAccountForm.getBaseApiUrlTextField().setVisible(true); + wxCpAccountForm.getBaseApiUrlLabel().setVisible(true); + } else { + wxCpAccountForm.getBaseApiUrlTextField().setVisible(false); + wxCpAccountForm.getBaseApiUrlLabel().setVisible(false); + } + }); } - UndoUtil.register(wxMpAccountForm); - return wxMpAccountForm; + UndoUtil.register(wxCpAccountForm); + return wxCpAccountForm; } { @@ -138,10 +161,10 @@ public class WxCpAccountForm implements IAccountForm { mainPanel = new JPanel(); mainPanel.setLayout(new GridLayoutManager(1, 1, new Insets(10, 5, 0, 0), -1, -1)); final JPanel panel1 = new JPanel(); - panel1.setLayout(new GridLayoutManager(5, 2, new Insets(0, 0, 0, 0), -1, -1)); + panel1.setLayout(new GridLayoutManager(7, 2, new Insets(0, 0, 0, 0), -1, -1)); mainPanel.add(panel1, 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)); final Spacer spacer1 = new Spacer(); - panel1.add(spacer1, new GridConstraints(4, 0, 1, 2, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_VERTICAL, 1, GridConstraints.SIZEPOLICY_WANT_GROW, null, null, null, 0, false)); + panel1.add(spacer1, new GridConstraints(6, 0, 1, 2, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_VERTICAL, 1, GridConstraints.SIZEPOLICY_WANT_GROW, null, null, null, 0, false)); final JLabel label1 = new JLabel(); label1.setText("应用名称"); panel1.add(label1, new GridConstraints(1, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); @@ -162,6 +185,14 @@ public class WxCpAccountForm implements IAccountForm { panel1.add(label4, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); corpIdTextField = new JTextField(); panel1.add(corpIdTextField, new GridConstraints(0, 1, 1, 1, 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)); + privateDepCheckBox = new JCheckBox(); + privateDepCheckBox.setText("私有化部署"); + panel1.add(privateDepCheckBox, new GridConstraints(4, 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)); + baseApiUrlTextField = new JTextField(); + panel1.add(baseApiUrlTextField, new GridConstraints(5, 1, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_FIXED, null, new Dimension(150, -1), null, 0, false)); + baseApiUrlLabel = new JLabel(); + baseApiUrlLabel.setText("私有BaseApiUrl"); + panel1.add(baseApiUrlLabel, new GridConstraints(5, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, 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 80044d76b6ad659f9ca460300306535cb1782166..8498a45c66f54bec2039d9c34f6a0a6a445eda61 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 @@ -47,6 +47,9 @@ public class MsgFormFactory { case MessageTypeEnum.TX_YUN_CODE: iMsgForm = TxYunMsgForm.getInstance(); break; + case MessageTypeEnum.TX_YUN_3_CODE: + iMsgForm = TxYun3MsgForm.getInstance(); + break; case MessageTypeEnum.QI_NIU_YUN_CODE: iMsgForm = QiNiuYunMsgForm.getInstance(); break; diff --git a/src/main/java/com/fangxuele/tool/push/ui/form/msg/TxYun3MsgForm.form b/src/main/java/com/fangxuele/tool/push/ui/form/msg/TxYun3MsgForm.form new file mode 100644 index 0000000000000000000000000000000000000000..2bb84d313e46770091d468ed594670b389d07080 --- /dev/null +++ b/src/main/java/com/fangxuele/tool/push/ui/form/msg/TxYun3MsgForm.form @@ -0,0 +1,120 @@ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/java/com/fangxuele/tool/push/ui/form/msg/TxYun3MsgForm.java b/src/main/java/com/fangxuele/tool/push/ui/form/msg/TxYun3MsgForm.java new file mode 100644 index 0000000000000000000000000000000000000000..6bc6fc51204cdc312b09e61bbb6ebaef96b28267 --- /dev/null +++ b/src/main/java/com/fangxuele/tool/push/ui/form/msg/TxYun3MsgForm.java @@ -0,0 +1,329 @@ +package com.fangxuele.tool.push.ui.form.msg; + +import cn.hutool.json.JSONUtil; +import com.fangxuele.tool.push.bean.TemplateData; +import com.fangxuele.tool.push.dao.TMsgMapper; +import com.fangxuele.tool.push.domain.TMsg; +import com.fangxuele.tool.push.domain.TMsgSms; +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.formdev.flatlaf.extras.FlatSVGIcon; +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.plaf.FontUIResource; +import javax.swing.table.DefaultTableCellRenderer; +import javax.swing.table.DefaultTableModel; +import javax.swing.table.TableColumnModel; +import javax.swing.text.StyleContext; +import java.awt.*; +import java.util.List; +import java.util.*; + +/** + *
+ * TxYun3MsgForm
+ * 
+ * + * @author Zhou Bo + * @since 2023/9/4. + */ +@Getter +public class TxYun3MsgForm 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 TxYun3MsgForm txYun3MsgForm; + + private static TMsgMapper msgMapper = MybatisUtil.getSqlSession().getMapper(TMsgMapper.class); + + public TxYun3MsgForm() { + templateMsgDataAddButton.setIcon(new FlatSVGIcon("icon/add.svg")); + + // 模板数据-添加 按钮事件 + 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(Integer msgId) { + clearAllField(); + TMsg tMsg = msgMapper.selectByPrimaryKey(msgId); + if (tMsg != null) { + TMsgSms tMsgSms = JSONUtil.toBean(tMsg.getContent(), TMsgSms.class); + getInstance().getMsgTemplateIdTextField().setText(tMsgSms.getTemplateId()); + + MessageEditForm messageEditForm = MessageEditForm.getInstance(); + messageEditForm.getMsgNameField().setText(tMsg.getMsgName()); + messageEditForm.getPreviewUserField().setText(tMsg.getPreviewUser()); + } + + initTemplateDataTable(); + // 模板消息Data表 + List templateDataList; + if (tMsg == null) { + templateDataList = new ArrayList<>(); + } else { + TMsgSms tMsgSms = JSONUtil.toBean(tMsg.getContent(), TMsgSms.class); + templateDataList = tMsgSms.getTemplateDataList(); + } + String[] headerNames = {"模板参数", "参数对应的值", "操作"}; + Object[][] cellData = new String[templateDataList.size()][headerNames.length]; + for (int i = 0; i < templateDataList.size(); i++) { + TemplateData 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(Integer accountId, String msgName) { + int msgId = 0; + boolean existSameMsg = false; + + TMsg tMsg = msgMapper.selectByUnique(MessageTypeEnum.TX_YUN_3_CODE, accountId, msgName); + if (tMsg != null) { + existSameMsg = true; + msgId = tMsg.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(); + + TMsg msg = new TMsg(); + TMsgSms tMsgSms = new TMsgSms(); + msg.setMsgType(MessageTypeEnum.TX_YUN_3_CODE); + msg.setAccountId(accountId); + msg.setMsgName(msgName); + tMsgSms.setTemplateId(templateId); + msg.setCreateTime(now); + msg.setModifiedTime(now); + + MessageEditForm messageEditForm = MessageEditForm.getInstance(); + msg.setPreviewUser(messageEditForm.getPreviewUserField().getText()); + + // 如果table为空,则初始化 + if (getInstance().getTemplateMsgDataTable().getModel().getRowCount() == 0) { + initTemplateDataTable(); + } + + // 逐行读取 + DefaultTableModel tableModel = (DefaultTableModel) getInstance().getTemplateMsgDataTable() + .getModel(); + int rowCount = tableModel.getRowCount(); + List templateDataList = new ArrayList<>(); + for (int i = 0; i < rowCount; i++) { + String name = (String) tableModel.getValueAt(i, 0); + String value = (String) tableModel.getValueAt(i, 1); + + TemplateData tTemplateData = new TemplateData(); + tTemplateData.setName(name); + tTemplateData.setValue(value); + + templateDataList.add(tTemplateData); + } + + tMsgSms.setTemplateDataList(templateDataList); + + msg.setContent(JSONUtil.toJsonStr(tMsgSms)); + if (existSameMsg) { + msg.setId(msgId); + msgMapper.updateByPrimaryKeySelective(msg); + } else { + msgMapper.insertSelective(msg); + } + + JOptionPane.showMessageDialog(MainWindow.getInstance().getMessagePanel(), "保存成功!", "成功", + JOptionPane.INFORMATION_MESSAGE); + } + + } + + public static TxYun3MsgForm getInstance() { + if (txYun3MsgForm == null) { + txYun3MsgForm = new TxYun3MsgForm(); + } + return txYun3MsgForm; + } + + /** + * 初始化模板消息数据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); + } + + /** + * 清空所有界面字段 + */ + @Override + public 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, 1, 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()), null)); + 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, 1, 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()), null)); + 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.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, 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)); + 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(); + } + } + Font font = new Font(resultName, style >= 0 ? style : currentFont.getStyle(), size >= 0 ? size : currentFont.getSize()); + boolean isMac = System.getProperty("os.name", "").toLowerCase(Locale.ENGLISH).startsWith("mac"); + Font fontWithFallback = isMac ? new Font(font.getFamily(), font.getStyle(), font.getSize()) : new StyleContext().getFont(font.getFamily(), font.getStyle(), font.getSize()); + return fontWithFallback instanceof FontUIResource ? fontWithFallback : new FontUIResource(fontWithFallback); + } + +} diff --git a/src/main/java/com/fangxuele/tool/push/ui/listener/FrameListener.java b/src/main/java/com/fangxuele/tool/push/ui/listener/FrameListener.java index dabdac2be8ebe1b0fe334646ad573fd8bb064de1..4e23343968d782e54566579018b03044a604d939 100644 --- a/src/main/java/com/fangxuele/tool/push/ui/listener/FrameListener.java +++ b/src/main/java/com/fangxuele/tool/push/ui/listener/FrameListener.java @@ -46,7 +46,7 @@ public class FrameListener { @Override public void windowClosing(WindowEvent e) { - mainFrame.dispose(); + mainFrame.setExtendedState(JFrame.ICONIFIED); if (!App.config.isCloseToTray()) { App.sqlSession.close(); mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); diff --git a/src/main/java/com/fangxuele/tool/push/ui/listener/MessageEditListener.java b/src/main/java/com/fangxuele/tool/push/ui/listener/MessageEditListener.java index 4979637116b915f99a58ea2021f374311fc75c7f..882dc9a6df5a322fd23cb6bd73b41d9feae9ee39 100644 --- a/src/main/java/com/fangxuele/tool/push/ui/listener/MessageEditListener.java +++ b/src/main/java/com/fangxuele/tool/push/ui/listener/MessageEditListener.java @@ -175,6 +175,7 @@ public class MessageEditListener { fillParaName = "预览消息用户的UserId(如果是聊天机器人消息,填写需要@ 的用户的手机号,如果@所有人 可不填写)"; paraDemo = "manager9115|manager9116|manager9117"; } else if (msgType == MessageTypeEnum.ALI_YUN_CODE || msgType == MessageTypeEnum.TX_YUN_CODE + || msgType == MessageTypeEnum.TX_YUN_3_CODE || msgType == MessageTypeEnum.HW_YUN_CODE || msgType == MessageTypeEnum.BD_YUN_CODE || msgType == MessageTypeEnum.UP_YUN_CODE || msgType == MessageTypeEnum.YUN_PIAN_CODE || msgType == MessageTypeEnum.QI_NIU_YUN_CODE) { 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 5ef2addc1172504d674493d069ed797e275c8c69..a00a9afdec7556417be284e80028236c16b1d27f 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 @@ -59,6 +59,10 @@ public class MessageTypeListener { App.config.setMsgType(MessageTypeEnum.TX_YUN_CODE); saveType(); }); + messageTypeForm.getTxYun3RadioButton().addActionListener(e -> { + App.config.setMsgType(MessageTypeEnum.TX_YUN_3_CODE); + saveType(); + }); messageTypeForm.getQiniuRadioButton().addActionListener(e -> { App.config.setMsgType(MessageTypeEnum.QI_NIU_YUN_CODE); saveType(); @@ -95,6 +99,10 @@ public class MessageTypeListener { App.config.setMsgType(MessageTypeEnum.DING_CODE); saveType(); }); + messageTypeForm.getTxYun3RadioButton().addActionListener(e -> { + App.config.setMsgType(MessageTypeEnum.TX_YUN_3_CODE); + saveType(); + }); messageTypeForm.getKefuPriorityTipsLabel().addMouseListener(new MouseAdapter() { @Override diff --git a/src/main/resources/version_summary.json b/src/main/resources/version_summary.json index 0780465a3892868fb293c6d8be7ebbc9a754531f..08d9f9c51cea6d44fa6706e846bf867904a8a213 100644 --- a/src/main/resources/version_summary.json +++ b/src/main/resources/version_summary.json @@ -1,9 +1,10 @@ { - "currentVersion": "v_5.0.1", + "currentVersion": "v_5.0.2", "versionIndex": { "v_0.0.0": "0", "v_5.0.0": "1", - "v_5.0.1": "2" + "v_5.0.1": "2", + "v_5.0.2": "3" }, "versionDetailList": [ { @@ -20,6 +21,11 @@ "version": "v_5.0.1", "title": "针对5.0新版多处修复和优化", "log": "● 任务:修复任务执行状态更新不及时的问题\n● 窗口:优化esc键最小化后窗口再次恢复的表现\n● 修复excel导入提示缺少依赖的问题\n● 任务:修复任务详情成功失败文件路径不实时显示的问题\n● 增加执行前重新导入目标用户功能\n● 任务详情增加模式和线程数等更多细节展示\n" + }, + { + "version": "v_5.0.2", + "title": "增加支持腾讯云短信3.0", + "log": "● 增加支持腾讯云短信3.0,由于没有条件,无法充分验证\n● 企业微信消息:支持私有化部署时BaseApiUrl配置\n● 全局:优化窗口关闭时的行为,避免再次点击任务栏图标无法唤出窗口\n" } ] } \ No newline at end of file