From d1bd705350ad0bd7ed25681601928ee36d5b970d Mon Sep 17 00:00:00 2001 From: wanggeng <450292408@qq.com> Date: Fri, 22 Oct 2021 18:14:40 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=9C=A8=E7=BA=BF=E5=8F=91?= =?UTF-8?q?=E9=80=81=E7=9F=AD=E4=BF=A1=E5=8A=9F=E8=83=BD=EF=BC=8C=E5=A4=84?= =?UTF-8?q?=E7=90=86=E4=BA=86=E7=9F=AD=E4=BF=A1=E5=8F=91=E9=80=81=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sms/controller/api/sms/SmsController.java | 12 +- .../route/sms/SmsRouteController.java | 7 + .../factory/sms/impl/DefaultSmsSendImpl.java | 4 +- .../module/sms/pojo/dtos/sms/SmsDTO.java | 40 +++--- .../wgink/module/sms/pojo/pos/sms/SmsPO.java | 51 ++++--- .../module/sms/pojo/vos/sms/SmsSendVO.java | 40 ++++++ .../wgink/module/sms/pojo/vos/sms/SmsVO.java | 36 +++-- .../module/sms/service/sms/ISmsService.java | 16 ++- .../sms/service/sms/impl/SmsServiceImpl.java | 62 ++++++++- .../resources/mybatis/mapper/sms-mapper.xml | 33 ++++- .../main/resources/templates/sms/list.html | 111 ++++++++++------ .../main/resources/templates/sms/send.html | 125 ++++++++++++++++++ 12 files changed, 421 insertions(+), 116 deletions(-) create mode 100644 module-sms/src/main/java/ink/wgink/module/sms/pojo/vos/sms/SmsSendVO.java create mode 100644 module-sms/src/main/resources/templates/sms/send.html diff --git a/module-sms/src/main/java/ink/wgink/module/sms/controller/api/sms/SmsController.java b/module-sms/src/main/java/ink/wgink/module/sms/controller/api/sms/SmsController.java index 5c5bd2af..e12b78ac 100644 --- a/module-sms/src/main/java/ink/wgink/module/sms/controller/api/sms/SmsController.java +++ b/module-sms/src/main/java/ink/wgink/module/sms/controller/api/sms/SmsController.java @@ -3,9 +3,9 @@ package ink.wgink.module.sms.controller.api.sms; import ink.wgink.annotation.CheckRequestBodyAnnotation; import ink.wgink.common.base.DefaultBaseController; import ink.wgink.exceptions.ParamsException; -import ink.wgink.exceptions.RemoveException; import ink.wgink.interfaces.consts.ISystemConstant; import ink.wgink.module.sms.pojo.dtos.sms.SmsDTO; +import ink.wgink.module.sms.pojo.vos.sms.SmsSendVO; import ink.wgink.module.sms.pojo.vos.sms.SmsVO; import ink.wgink.module.sms.service.sms.ISmsService; import ink.wgink.pojo.ListPage; @@ -16,7 +16,6 @@ import ink.wgink.util.RegexUtil; import io.swagger.annotations.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; -import org.springframework.web.servlet.mvc.AbstractController; import java.util.Arrays; import java.util.List; @@ -40,6 +39,15 @@ public class SmsController extends DefaultBaseController { @Autowired private ISmsService smsService; + @ApiOperation(value = "发送短信", notes = "发送短信接口") + @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) + @PostMapping("send") + @CheckRequestBodyAnnotation + public SuccessResult send(@RequestBody SmsSendVO smsSendVO) throws Exception { + smsService.send(smsSendVO); + return new SuccessResult(); + } + @ApiOperation(value = "新增短信", notes = "新增短信接口") @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) @PostMapping("save") diff --git a/module-sms/src/main/java/ink/wgink/module/sms/controller/route/sms/SmsRouteController.java b/module-sms/src/main/java/ink/wgink/module/sms/controller/route/sms/SmsRouteController.java index 7d790a55..9d175fad 100644 --- a/module-sms/src/main/java/ink/wgink/module/sms/controller/route/sms/SmsRouteController.java +++ b/module-sms/src/main/java/ink/wgink/module/sms/controller/route/sms/SmsRouteController.java @@ -29,4 +29,11 @@ public class SmsRouteController { return mv; } + @GetMapping("send") + public ModelAndView send() { + ModelAndView mv = new ModelAndView(); + mv.setViewName("sms/send"); + return mv; + } + } diff --git a/module-sms/src/main/java/ink/wgink/module/sms/factory/sms/impl/DefaultSmsSendImpl.java b/module-sms/src/main/java/ink/wgink/module/sms/factory/sms/impl/DefaultSmsSendImpl.java index 8187db14..b177e2b0 100644 --- a/module-sms/src/main/java/ink/wgink/module/sms/factory/sms/impl/DefaultSmsSendImpl.java +++ b/module-sms/src/main/java/ink/wgink/module/sms/factory/sms/impl/DefaultSmsSendImpl.java @@ -60,9 +60,9 @@ public class DefaultSmsSendImpl implements ISmsSend { String result = restTemplate.getForObject(URL_SMS, String.class, paramArray); JSONObject jsonObject = XML.toJSONObject(result); if (StringUtils.equals("Success", jsonObject.getJSONObject("returnsms").getString("returnstatus"))) { - LOG.info("验证码发送成功"); + LOG.info("短信发送成功"); } else { - LOG.error("验证码发送失败,原因:{}。", jsonObject); + LOG.error("短信发送失败,原因:{}。", jsonObject); throw new SystemException(jsonObject.toString()); } } diff --git a/module-sms/src/main/java/ink/wgink/module/sms/pojo/dtos/sms/SmsDTO.java b/module-sms/src/main/java/ink/wgink/module/sms/pojo/dtos/sms/SmsDTO.java index 54655f82..e3ddcbe5 100644 --- a/module-sms/src/main/java/ink/wgink/module/sms/pojo/dtos/sms/SmsDTO.java +++ b/module-sms/src/main/java/ink/wgink/module/sms/pojo/dtos/sms/SmsDTO.java @@ -4,7 +4,6 @@ import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; /** - * * @ClassName: SmsDTO * @Description: 短信 * @Author: WenG @@ -16,8 +15,12 @@ public class SmsDTO { @ApiModelProperty(name = "smsId", value = "主键") private String smsId; + @ApiModelProperty(name = "userId", value = "用户ID") + private String userId; @ApiModelProperty(name = "phone", value = "电话") private String phone; + @ApiModelProperty(name = "userName", value = "用户昵称") + private String userName; @ApiModelProperty(name = "content", value = "发送内容") private String content; @ApiModelProperty(name = "sendStatus", value = "发送状态") @@ -34,6 +37,15 @@ public class SmsDTO { public void setSmsId(String smsId) { this.smsId = smsId; } + + public String getUserId() { + return userId == null ? "" : userId.trim(); + } + + public void setUserId(String userId) { + this.userId = userId; + } + public String getPhone() { return phone == null ? "" : phone; } @@ -42,6 +54,14 @@ public class SmsDTO { this.phone = phone; } + public String getUserName() { + return userName == null ? "" : userName.trim(); + } + + public void setUserName(String userName) { + this.userName = userName; + } + public String getContent() { return content == null ? "" : content; } @@ -74,22 +94,4 @@ public class SmsDTO { this.gmtCreate = gmtCreate; } - @Override - public String toString() { - final StringBuilder sb = new StringBuilder("{"); - sb.append("\"smsId\":\"") - .append(smsId).append('\"'); - sb.append(",\"phone\":\"") - .append(phone).append('\"'); - sb.append(",\"content\":\"") - .append(content).append('\"'); - sb.append(",\"sendStatus\":") - .append(sendStatus); - sb.append(",\"errorMessage\":\"") - .append(errorMessage).append('\"'); - sb.append(",\"gmtCreate\":\"") - .append(gmtCreate).append('\"'); - sb.append('}'); - return sb.toString(); - } } diff --git a/module-sms/src/main/java/ink/wgink/module/sms/pojo/pos/sms/SmsPO.java b/module-sms/src/main/java/ink/wgink/module/sms/pojo/pos/sms/SmsPO.java index 6112fb60..e8511bba 100644 --- a/module-sms/src/main/java/ink/wgink/module/sms/pojo/pos/sms/SmsPO.java +++ b/module-sms/src/main/java/ink/wgink/module/sms/pojo/pos/sms/SmsPO.java @@ -1,8 +1,5 @@ package ink.wgink.module.sms.pojo.pos.sms; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; - /** * * @ClassName: SmsDTO @@ -14,29 +11,48 @@ import io.swagger.annotations.ApiModelProperty; public class SmsPO { private String smsId; + private String userId; private String phone; + private String userName; private String content; private Integer sendStatus; private String errorMessage; private String gmtCreate; public String getSmsId() { - return smsId == null ? "" : smsId; + return smsId == null ? "" : smsId.trim(); } public void setSmsId(String smsId) { this.smsId = smsId; } + + public String getUserId() { + return userId == null ? "" : userId.trim(); + } + + public void setUserId(String userId) { + this.userId = userId; + } + public String getPhone() { - return phone == null ? "" : phone; + return phone == null ? "" : phone.trim(); } public void setPhone(String phone) { this.phone = phone; } + public String getUserName() { + return userName == null ? "" : userName.trim(); + } + + public void setUserName(String userName) { + this.userName = userName; + } + public String getContent() { - return content == null ? "" : content; + return content == null ? "" : content.trim(); } public void setContent(String content) { @@ -52,7 +68,7 @@ public class SmsPO { } public String getErrorMessage() { - return errorMessage == null ? "" : errorMessage; + return errorMessage == null ? "" : errorMessage.trim(); } public void setErrorMessage(String errorMessage) { @@ -60,29 +76,10 @@ public class SmsPO { } public String getGmtCreate() { - return gmtCreate == null ? "" : gmtCreate; + return gmtCreate == null ? "" : gmtCreate.trim(); } public void setGmtCreate(String gmtCreate) { this.gmtCreate = gmtCreate; } - - @Override - public String toString() { - final StringBuilder sb = new StringBuilder("{"); - sb.append("\"smsId\":\"") - .append(smsId).append('\"'); - sb.append(",\"phone\":\"") - .append(phone).append('\"'); - sb.append(",\"content\":\"") - .append(content).append('\"'); - sb.append(",\"sendStatus\":") - .append(sendStatus); - sb.append(",\"errorMessage\":\"") - .append(errorMessage).append('\"'); - sb.append(",\"gmtCreate\":\"") - .append(gmtCreate).append('\"'); - sb.append('}'); - return sb.toString(); - } } diff --git a/module-sms/src/main/java/ink/wgink/module/sms/pojo/vos/sms/SmsSendVO.java b/module-sms/src/main/java/ink/wgink/module/sms/pojo/vos/sms/SmsSendVO.java new file mode 100644 index 00000000..6a68a59b --- /dev/null +++ b/module-sms/src/main/java/ink/wgink/module/sms/pojo/vos/sms/SmsSendVO.java @@ -0,0 +1,40 @@ +package ink.wgink.module.sms.pojo.vos.sms; + +import ink.wgink.annotation.CheckEmptyAnnotation; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * @ClassName: SmsVO + * @Description: 短信 + * @Author: WenG + * @Date: 2020-03-14 16:01 + * @Version: 1.0 + **/ +@ApiModel +public class SmsSendVO { + + @ApiModelProperty(name = "userIds", value = "用户ID列表") + @CheckEmptyAnnotation(name = "用户ID列表") + private String userIds; + @ApiModelProperty(name = "content", value = "发送内容") + @CheckEmptyAnnotation(name = "发送内容") + private String content; + + public String getUserIds() { + return userIds == null ? "" : userIds.trim(); + } + + public void setUserIds(String userIds) { + this.userIds = userIds; + } + + public String getContent() { + return content == null ? "" : content; + } + + public void setContent(String content) { + this.content = content; + } + +} diff --git a/module-sms/src/main/java/ink/wgink/module/sms/pojo/vos/sms/SmsVO.java b/module-sms/src/main/java/ink/wgink/module/sms/pojo/vos/sms/SmsVO.java index a89ccfe7..2610997b 100644 --- a/module-sms/src/main/java/ink/wgink/module/sms/pojo/vos/sms/SmsVO.java +++ b/module-sms/src/main/java/ink/wgink/module/sms/pojo/vos/sms/SmsVO.java @@ -15,6 +15,12 @@ import io.swagger.annotations.ApiModelProperty; @ApiModel public class SmsVO { + @ApiModelProperty(name = "userId", value = "用户ID") + @CheckEmptyAnnotation(name = "用户ID") + private String userId; + @ApiModelProperty(name = "userName", value = "用户昵称") + @CheckEmptyAnnotation(name = "用户昵称") + private String userName; @ApiModelProperty(name = "phone", value = "电话") @CheckEmptyAnnotation(name = "电话", verifyType = "phone") private String phone; @@ -26,6 +32,22 @@ public class SmsVO { @ApiModelProperty(name = "errorMessage", value = "错误信息") private String errorMessage; + public String getUserId() { + return userId == null ? "" : userId.trim(); + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getUserName() { + return userName == null ? "" : userName.trim(); + } + + public void setUserName(String userName) { + this.userName = userName; + } + public String getPhone() { return phone == null ? "" : phone; } @@ -58,18 +80,4 @@ public class SmsVO { this.errorMessage = errorMessage; } - @Override - public String toString() { - final StringBuilder sb = new StringBuilder("{"); - sb.append("\"phone\":\"") - .append(phone).append('\"'); - sb.append(",\"content\":\"") - .append(content).append('\"'); - sb.append(",\"sendStatus\":") - .append(sendStatus); - sb.append(",\"errorMessage\":\"") - .append(errorMessage).append('\"'); - sb.append('}'); - return sb.toString(); - } } diff --git a/module-sms/src/main/java/ink/wgink/module/sms/service/sms/ISmsService.java b/module-sms/src/main/java/ink/wgink/module/sms/service/sms/ISmsService.java index 3ca1647c..ebeb7527 100644 --- a/module-sms/src/main/java/ink/wgink/module/sms/service/sms/ISmsService.java +++ b/module-sms/src/main/java/ink/wgink/module/sms/service/sms/ISmsService.java @@ -2,6 +2,7 @@ package ink.wgink.module.sms.service.sms; import ink.wgink.interfaces.sms.ISmsBaseService; import ink.wgink.module.sms.pojo.dtos.sms.SmsDTO; +import ink.wgink.module.sms.pojo.vos.sms.SmsSendVO; import ink.wgink.module.sms.pojo.vos.sms.SmsVO; import ink.wgink.pojo.ListPage; import ink.wgink.pojo.result.SuccessResultList; @@ -71,10 +72,12 @@ public interface ISmsService extends ISmsBaseService { /** * 发送短信 * - * @param phone - * @param content + * @param userId 用户ID + * @param phone 用户手机 + * @param userName 用户昵称 + * @param content 发送内容 */ - void sendContent(String phone, String content); + void sendContentByUserIdAndPhoneAndUserName(String userId, String phone, String userName, String content); /** * 发送验证码 @@ -83,5 +86,10 @@ public interface ISmsService extends ISmsBaseService { */ void sendVerifyCode(String phone); - + /** + * 发送短信 + * + * @param smsSendVO + */ + void send(SmsSendVO smsSendVO); } diff --git a/module-sms/src/main/java/ink/wgink/module/sms/service/sms/impl/SmsServiceImpl.java b/module-sms/src/main/java/ink/wgink/module/sms/service/sms/impl/SmsServiceImpl.java index 71f7dc60..dff8769e 100644 --- a/module-sms/src/main/java/ink/wgink/module/sms/service/sms/impl/SmsServiceImpl.java +++ b/module-sms/src/main/java/ink/wgink/module/sms/service/sms/impl/SmsServiceImpl.java @@ -5,22 +5,29 @@ import com.github.pagehelper.PageInfo; import ink.wgink.common.base.DefaultBaseService; import ink.wgink.exceptions.ParamsException; import ink.wgink.exceptions.base.SystemException; +import ink.wgink.interfaces.user.IUserBaseService; import ink.wgink.module.sms.dao.sms.ISmsDao; import ink.wgink.module.sms.factory.sms.SmsSendFactory; import ink.wgink.module.sms.manager.VerifyCodeManager; import ink.wgink.module.sms.pojo.dtos.sms.SmsDTO; +import ink.wgink.module.sms.pojo.vos.sms.SmsSendVO; import ink.wgink.module.sms.pojo.vos.sms.SmsVO; import ink.wgink.module.sms.service.sms.ISmsService; import ink.wgink.pojo.ListPage; +import ink.wgink.pojo.dtos.user.UserDTO; import ink.wgink.pojo.result.SuccessResultList; import ink.wgink.properties.sms.SmsProperties; +import ink.wgink.util.RegexUtil; import ink.wgink.util.UUIDUtil; import ink.wgink.util.map.HashMapUtil; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import java.util.List; -import java.util.Map; +import java.util.*; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.TimeUnit; /** * When you feel like quitting. Think about why you started @@ -39,6 +46,9 @@ public class SmsServiceImpl extends DefaultBaseService implements ISmsService { private SmsProperties smsProperties; @Autowired private ISmsDao smsDao; + @Autowired + private IUserBaseService userBaseService; + private ScheduledExecutorService scheduledExecutorService = new ScheduledThreadPoolExecutor(2); @Override public void save(SmsVO smsVO) { @@ -82,8 +92,10 @@ public class SmsServiceImpl extends DefaultBaseService implements ISmsService { } @Override - public void sendContent(String phone, String content) { + public void sendContentByUserIdAndPhoneAndUserName(String userId, String phone, String userName, String content) { SmsVO smsVO = new SmsVO(); + smsVO.setUserId(userId); + smsVO.setUserName(userName); smsVO.setPhone(phone); smsVO.setContent(content); try { @@ -129,8 +141,52 @@ public class SmsServiceImpl extends DefaultBaseService implements ISmsService { } } + @Override + public void send(SmsSendVO smsSendVO) { + List userIds = Arrays.asList(smsSendVO.getUserIds().split("\\_")); + List userDTOs = userBaseService.listByUserIds(userIds); + for (UserDTO userDTO : userDTOs) { + if (!RegexUtil.isPhone(userDTO.getUserUsername())) { + throw new ParamsException(userDTO.getUserName() + " 的用户名不是手机号"); + } + } + scheduledExecutorService.schedule(() -> { + for (UserDTO userDTO : userDTOs) { + sendContentByUserIdAndPhoneAndUserName(userDTO.getUserId(), userDTO.getUserUsername(), userDTO.getUserName(), smsSendVO.getContent()); + } + }, 3, TimeUnit.SECONDS); + } + @Override public String getVerifyCode(String phone) { return VerifyCodeManager.getInstance().getVerifyCode(phone); } + + /** + * 设置用户 + * + * @param smsDTOs + */ + private void setUser(List smsDTOs) { + if (smsDTOs.isEmpty()) { + return; + } + Set usernameSet = new HashSet<>(); + for (SmsDTO smsDTO : smsDTOs) { + usernameSet.add(smsDTO.getPhone()); + } + List userDTOs = userBaseService.listByUsernames(new ArrayList<>(usernameSet)); + if (userDTOs.isEmpty()) { + return; + } + for (SmsDTO smsDTO : smsDTOs) { + for (UserDTO userDTO : userDTOs) { + if (StringUtils.equals(smsDTO.getPhone(), userDTO.getUserUsername())) { + smsDTO.setUserName(userDTO.getUserName()); + break; + } + } + } + } + } diff --git a/module-sms/src/main/resources/mybatis/mapper/sms-mapper.xml b/module-sms/src/main/resources/mybatis/mapper/sms-mapper.xml index 8d15bd93..0829bc54 100644 --- a/module-sms/src/main/resources/mybatis/mapper/sms-mapper.xml +++ b/module-sms/src/main/resources/mybatis/mapper/sms-mapper.xml @@ -4,15 +4,20 @@ + + + + + @@ -24,7 +29,9 @@ CREATE TABLE IF NOT EXISTS `sms_sms` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增主键', `sms_id` char(36) NOT NULL COMMENT '主键', + `user_id` char(36) DEFAULT NULL COMMENT '用户ID', `phone` varchar(255) DEFAULT NULL COMMENT '电话', + `user_name` varchar(255) DEFAULT NULL COMMENT '昵称', `content` varchar(255) DEFAULT NULL COMMENT '发送内容', `send_status` int(11) DEFAULT NULL COMMENT '发送状态', `error_message` varchar(255) DEFAULT NULL COMMENT '错误信息', @@ -38,14 +45,16 @@ KEY `phone` (`phone`), KEY `send_status` (`send_status`), KEY `is_delete` (`is_delete`) - ) ENGINE=InnoDB DEFAULT CHARSET=utf8; + ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; INSERT INTO sms_sms( sms_id, + user_id, phone, + user_name, content, send_status, error_message, @@ -56,7 +65,9 @@ is_delete ) VALUES( #{smsId}, + #{userId}, #{phone}, + #{userName}, #{content}, #{sendStatus}, #{errorMessage}, @@ -109,7 +120,9 @@ SELECT + t1.user_id, t1.phone, + t1.user_name, t1.content, t1.send_status, t1.error_message, @@ -145,10 +160,13 @@ @@ -181,7 +208,9 @@ + + + 发送时间 +
+
- -
-
- +
+ + + + + + + + \ No newline at end of file