From 475ed59d4ad0b189d2b8613a400b927b97f34478 Mon Sep 17 00:00:00 2001
From: 克 刘 <4345453@qq.com>
Date: Sat, 15 Aug 2020 09:14:09 +0800
Subject: [PATCH] 短信微服务合并到文件操作微服务,当做平台插件微服务,原短信微服务在框架中保留

---
 kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-biz/src/main/java/com/kidgrow/sms/util/AliyunSmsUtils.java                               |  175 +++++++++
 kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-api/src/main/java/com/kidgrow/sms/feign/SmsChuangLanService.java                         |   29 +
 kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-biz/src/main/java/com/kidgrow/sms/exception/SmsException.java                            |   31 +
 kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-biz/src/main/java/com/kidgrow/sms/util/SmsChuangLanUtils.java                            |   63 +++
 kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-server/src/main/java/com/kidgrow/sms/aliyun/config/SmsProperties.java                    |   37 +
 kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-biz/src/main/java/com/kidgrow/sms/service/AliyunSmsService.java                          |   44 ++
 kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-server/src/main/java/com/kidgrow/sms/lanchuang/controller/SmsChuangLanController.java    |  156 ++++++++
 kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-server/src/main/resources/application.yml                                                |   36 +
 kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-api/src/main/java/com/kidgrow/sms/model/ConstantSMS.java                                 |    9 
 kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-biz/src/main/java/com/kidgrow/sms/template/BatchSmsTemplate.java                         |   26 +
 kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-server/src/main/java/com/kidgrow/sms/aliyun/controller/SmsController.java                |  133 +++++++
 kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-api/src/main/java/com/kidgrow/sms/feign/fallback/SmsChuangLanServiceFallbackFactory.java |   27 +
 kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-api/src/main/java/com/kidgrow/sms/model/SmsModel.java                                    |   28 +
 kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-biz/src/main/java/com/kidgrow/sms/template/SmsTemplate.java                              |   27 +
 kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-server/src/main/java/com/kidgrow/sms/aliyun/config/SmsAutoConfiguration.java             |   46 ++
 kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-biz/src/main/java/com/kidgrow/sms/client/SmsClient.java                                  |  216 +++++++++++
 16 files changed, 1,083 insertions(+), 0 deletions(-)

diff --git a/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-api/src/main/java/com/kidgrow/sms/feign/SmsChuangLanService.java b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-api/src/main/java/com/kidgrow/sms/feign/SmsChuangLanService.java
new file mode 100644
index 0000000..a82b647
--- /dev/null
+++ b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-api/src/main/java/com/kidgrow/sms/feign/SmsChuangLanService.java
@@ -0,0 +1,29 @@
+package com.kidgrow.sms.feign;
+
+import com.kidgrow.common.constant.ServiceNameConstants;
+import com.kidgrow.common.model.ResultBody;
+import com.kidgrow.sms.feign.fallback.SmsChuangLanServiceFallbackFactory;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: <br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/2/27 22:04 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+@FeignClient(value = ServiceNameConstants.SMS_SERVICE_SERVER,
+        fallbackFactory = SmsChuangLanServiceFallbackFactory.class, decode404 = true)
+public interface SmsChuangLanService {
+    /**
+     * feign rpc访问远程 接口
+     */
+    @PostMapping(value = "/smsChangLan/send")
+    ResultBody sendVerificationCode(@RequestBody Map map);
+
+}
diff --git a/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-api/src/main/java/com/kidgrow/sms/feign/fallback/SmsChuangLanServiceFallbackFactory.java b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-api/src/main/java/com/kidgrow/sms/feign/fallback/SmsChuangLanServiceFallbackFactory.java
new file mode 100644
index 0000000..83c9277
--- /dev/null
+++ b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-api/src/main/java/com/kidgrow/sms/feign/fallback/SmsChuangLanServiceFallbackFactory.java
@@ -0,0 +1,27 @@
+package com.kidgrow.sms.feign.fallback;
+
+import com.kidgrow.common.model.ResultBody;
+import com.kidgrow.sms.feign.SmsChuangLanService;
+import feign.hystrix.FallbackFactory;
+
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: <br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/2/27 22:05 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+public class SmsChuangLanServiceFallbackFactory implements FallbackFactory<SmsChuangLanService> {
+    @Override
+    public SmsChuangLanService create(Throwable throwable) {
+        return new SmsChuangLanService() {
+            @Override
+            public ResultBody sendVerificationCode(Map ma) {
+                return ResultBody.failed("短息调用失败");
+            }
+        };
+    }
+}
diff --git a/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-api/src/main/java/com/kidgrow/sms/model/ConstantSMS.java b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-api/src/main/java/com/kidgrow/sms/model/ConstantSMS.java
new file mode 100644
index 0000000..86f32f2
--- /dev/null
+++ b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-api/src/main/java/com/kidgrow/sms/model/ConstantSMS.java
@@ -0,0 +1,9 @@
+package com.kidgrow.sms.model;
+
+import com.kidgrow.common.constant.CommonConstant;
+
+public interface ConstantSMS {
+    String PASSWORD_SMS = "PASSWORD_SMS";//修改密码 短信验证的type值
+    String REGISTER_SMS = "REGISTER_SMS";//注册 短信验证的type值
+    String PHONE_SMS = "PHONE_SMS";//更换手机号 短信验证的type值
+}
diff --git a/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-api/src/main/java/com/kidgrow/sms/model/SmsModel.java b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-api/src/main/java/com/kidgrow/sms/model/SmsModel.java
new file mode 100644
index 0000000..fb7ae0a
--- /dev/null
+++ b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-api/src/main/java/com/kidgrow/sms/model/SmsModel.java
@@ -0,0 +1,28 @@
+package com.kidgrow.sms.model;
+
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: 发送短信实体类<br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/2/17 09:18 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+@ApiModel(value = "发送短信实体类")
+@Data
+public class SmsModel implements Serializable {
+
+    private String phoneNumber; //手机号
+    private String key; // 短信模板key
+    private String code; // 短信验证码
+    private Map<String,String> params; // 内容 key 值要与模板一致
+    private List<String> phoneNumbers; // 群发消息时使用
+
+}
diff --git a/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-biz/src/main/java/com/kidgrow/sms/client/SmsClient.java b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-biz/src/main/java/com/kidgrow/sms/client/SmsClient.java
new file mode 100644
index 0000000..0288e7b
--- /dev/null
+++ b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-biz/src/main/java/com/kidgrow/sms/client/SmsClient.java
@@ -0,0 +1,216 @@
+package com.kidgrow.sms.client;
+
+import com.aliyuncs.CommonRequest;
+import com.aliyuncs.CommonResponse;
+import com.aliyuncs.DefaultAcsClient;
+import com.aliyuncs.IAcsClient;
+import com.aliyuncs.exceptions.ClientException;
+import com.aliyuncs.http.MethodType;
+import com.aliyuncs.profile.DefaultProfile;
+import com.aliyuncs.profile.IClientProfile;
+import com.google.gson.Gson;
+import com.kidgrow.sms.exception.SmsException;
+import com.kidgrow.sms.template.BatchSmsTemplate;
+import com.kidgrow.sms.template.SmsTemplate;
+import com.kidgrow.sms.util.AliyunSmsUtils;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+import java.util.*;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: 阿里云 SMS 客户端<br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/2/17 09:07 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+public class SmsClient {
+    private final IAcsClient acsClient;
+    private final Map<String, SmsTemplate> smsTemplates;
+    private final Gson gson = new Gson();
+
+    @Value("${aliyun.commonRequest.domain}")
+    private String domain;
+
+    @Value("${aliyun.commonRequest.version}")
+    private String version;
+
+    @Value("${aliyun.commonRequest.action}")
+    private String action;
+
+    /**
+     * Instantiates a new SmsClient.
+     *
+     * @param accessKeyId 阿里云短信 accessKeyId
+     * @param accessKeySecret 阿里云短信 accessKeySecret
+     */
+    public SmsClient(final String accessKeyId, final String accessKeySecret) {
+        this(accessKeyId, accessKeySecret, Collections.emptyMap());
+    }
+
+    /**
+     * Instantiates a new SmsClient.
+     *
+     * @param accessKeyId 阿里云短信 accessKeyId
+     * @param accessKeySecret 阿里云短信 accessKeySecret
+     * @param smsTemplates 预置短信模板
+     */
+    public SmsClient(final String accessKeyId,
+                     final String accessKeySecret,
+                     final Map<String, SmsTemplate> smsTemplates) {
+        AliyunSmsUtils.checkNotEmpty(accessKeyId, "'accessKeyId' must be not empty");
+        AliyunSmsUtils.checkNotEmpty(accessKeySecret, "'accessKeySecret' must be not empty");
+
+        final IClientProfile clientProfile = DefaultProfile.getProfile(
+                "default", accessKeyId, accessKeySecret);
+
+        this.acsClient = new DefaultAcsClient(clientProfile);
+        this.smsTemplates = smsTemplates;
+    }
+
+    /**
+     * Instantiates a new SmsClient.
+     *
+     * @param acsClient IAcsClient
+     * @param smsTemplates 预置短信模板
+     */
+    public SmsClient(final IAcsClient acsClient, final Map<String, SmsTemplate> smsTemplates) {
+        this.acsClient = acsClient;
+        this.smsTemplates = smsTemplates;
+    }
+
+    /**
+     * 发送短信验证码.
+     *
+     * @param phoneNumber 手机号码(中国)
+     *
+     * @return 6 位数的随机码
+     */
+    public int sendVerificationCode(final String smsTemplateKey, final String phoneNumber) {
+        AliyunSmsUtils.checkPhoneNumber(phoneNumber);
+        final SmsTemplate smsTemplate = this.smsTemplates.get(smsTemplateKey);
+        Objects.requireNonNull(smsTemplate, () -> "SmsTemplate must be not null, key:" + smsTemplateKey);
+
+        final int code = AliyunSmsUtils.randomCode();
+        smsTemplate.setTemplateParam(Collections.singletonMap("code", String.valueOf(code)));
+        smsTemplate.setPhoneNumbers(Collections.singletonList(phoneNumber));
+        send(smsTemplate);
+        return code;
+    }
+
+    /**
+     * 发送消息 支持群发
+     * @param smsTemplateKey
+     * @param params
+     * @param phoneNumbers
+     */
+    public void sendSmsMsg(final String smsTemplateKey, Map<String, String> params, final List<String> phoneNumbers){
+        final SmsTemplate smsTemplate = this.smsTemplates.get(smsTemplateKey);
+        Objects.requireNonNull(smsTemplate, () -> "SmsTemplate must be not null, key:" + smsTemplateKey);
+
+        smsTemplate.setTemplateParam(params);
+        smsTemplate.setPhoneNumbers(phoneNumbers);
+        send(smsTemplate);
+    }
+
+    /**
+     * 发送短信.
+     *
+     * @param smsTemplateKey 预置短信模板 key
+     */
+    public void send(final String smsTemplateKey) {
+        final SmsTemplate smsTemplate = this.smsTemplates.get(smsTemplateKey);
+        Objects.requireNonNull(smsTemplate, () -> "SmsTemplate must be not null, key:" + smsTemplateKey);
+
+        send(smsTemplate);
+    }
+
+    /**
+     * 发送短信.
+     *
+     * @param smsTemplateKey 预置短信模板 key
+     * @param phoneNumbers 手机号码,优先于预置短信模板中配置的手机号码
+     */
+    public void send(final String smsTemplateKey, final String... phoneNumbers) {
+        final SmsTemplate smsTemplate = this.smsTemplates.get(smsTemplateKey);
+        Objects.requireNonNull(smsTemplate, () -> "SmsTemplate must be not null, key:" + smsTemplateKey);
+
+        smsTemplate.setPhoneNumbers(Arrays.asList(phoneNumbers));
+        send(smsTemplate);
+    }
+
+    /**
+     * 发送短信.
+     *
+     * @param smsTemplate 短信模板
+     */
+    public void send(final SmsTemplate smsTemplate) {
+        Objects.requireNonNull(smsTemplate);
+        AliyunSmsUtils.checkSmsTemplate(smsTemplate);
+
+        final CommonRequest request = new CommonRequest();
+        request.setSysMethod(MethodType.POST);
+        request.setSysDomain(domain);
+        request.setSysVersion(version);
+        request.setSysAction(action);
+        request.putQueryParameter("PhoneNumbers", String.join(",", smsTemplate.getPhoneNumbers()));
+        request.putQueryParameter("SignName", smsTemplate.getSignName());
+        request.putQueryParameter("TemplateCode", smsTemplate.getTemplateCode());
+        request.putQueryParameter("TemplateParam", AliyunSmsUtils.toJsonStr(smsTemplate.getTemplateParam()));
+        try {
+            final CommonResponse response = this.acsClient.getCommonResponse(request);
+            AliyunSmsUtils.checkSmsResponse(response);
+        }
+        catch (final ClientException e) {
+            throw new SmsException(e);
+        }
+    }
+
+    /**
+     * 批量发送短信.
+     *
+     * <p>
+     * 批量发送短信接口,支持在一次请求中分别向多个不同的手机号码发送不同签名的短信。
+     * 手机号码,签名,模板参数字段个数相同,一一对应,短信服务根据字段的顺序判断发往指定手机号码的签名。
+     *
+     * <p>
+     * 如果您需要往多个手机号码中发送同样签名的短信,请使用 {@link #send(SmsTemplate)}。
+     *
+     * @param batchSmsTemplate 批量发送短信模板
+     */
+    public void send(final BatchSmsTemplate batchSmsTemplate) {
+        Objects.requireNonNull(batchSmsTemplate);
+        AliyunSmsUtils.checkBatchSmsTemplate(batchSmsTemplate);
+
+        final CommonRequest request = new CommonRequest();
+        request.setSysMethod(MethodType.POST);
+        request.setSysDomain("dysmsapi.aliyuncs.com");
+        request.setSysVersion("2017-05-25");
+        request.setSysAction("SendBatchSms");
+        request.putQueryParameter("PhoneNumberJson", this.gson.toJson(batchSmsTemplate.getPhoneNumbers()));
+        request.putQueryParameter("SignNameJson", this.gson.toJson(batchSmsTemplate.getSignNames()));
+        request.putQueryParameter("TemplateCode", batchSmsTemplate.getTemplateCode());
+        request.putQueryParameter("TemplateParamJson", this.gson.toJson(batchSmsTemplate.getTemplateParams()));
+        try {
+            final CommonResponse response = this.acsClient.getCommonResponse(request);
+            AliyunSmsUtils.checkSmsResponse(response);
+        }
+        catch (final ClientException e) {
+            throw new SmsException(e);
+        }
+    }
+
+//    public static void main(String[] args) {
+//        Map<String, SmsTemplate> smsTemplates = new HashMap<>();
+//        SmsTemplate smsTemplate = SmsTemplate.builder()
+//                .signName("模板名称")
+//                .templateCode("模板code")
+//                .addTemplateParam("code", "123456")
+//                .build();
+//        smsTemplates.put("aaa",smsTemplate);
+//        SmsClient smsClient = new SmsClient("aaaa","aaaaa",smsTemplates);
+//        smsClient.sendVerificationCode("aaa","18503198351");
+//    }
+}
diff --git a/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-biz/src/main/java/com/kidgrow/sms/exception/SmsException.java b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-biz/src/main/java/com/kidgrow/sms/exception/SmsException.java
new file mode 100644
index 0000000..4f74858
--- /dev/null
+++ b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-biz/src/main/java/com/kidgrow/sms/exception/SmsException.java
@@ -0,0 +1,31 @@
+package com.kidgrow.sms.exception;
+
+import com.kidgrow.common.exception.KidgrowException;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: <br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/2/17 08:57 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+public class SmsException extends KidgrowException {
+    /**
+     * Instantiates a new SmsException.
+     *
+     * @param message the message
+     */
+    public SmsException(final String message) {
+        super(message);
+    }
+
+    /**
+     * Instantiates a new SmsException.
+     *
+     * @param cause the cause
+     */
+    public SmsException(final Throwable cause) {
+        super(cause);
+    }
+}
diff --git a/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-biz/src/main/java/com/kidgrow/sms/service/AliyunSmsService.java b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-biz/src/main/java/com/kidgrow/sms/service/AliyunSmsService.java
new file mode 100644
index 0000000..29556ac
--- /dev/null
+++ b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-biz/src/main/java/com/kidgrow/sms/service/AliyunSmsService.java
@@ -0,0 +1,44 @@
+package com.kidgrow.sms.service;
+
+import com.kidgrow.common.model.ResultBody;
+import com.kidgrow.sms.model.SmsModel;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: 对外API 短信发送和验证码校验接口 feignClient 继承这个接口 即可调用<br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/2/17 09:20 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+@Api(tags = "短信发送服务")
+public interface AliyunSmsService {
+
+    /**
+     * 发送手机验证码
+     * @param smsModel
+     */
+    @ApiOperation(value = "发送短信验证码接口")
+    @PostMapping("/send/verificationCode")
+    ResultBody sendVerificationCode(@RequestBody SmsModel smsModel);
+
+    /**
+     * 校验手机验证码是否正确
+     * @param smsModel
+     */
+    @ApiOperation(value = "验证短信验证码接口")
+    @PostMapping("/validate/verificationCode")
+    ResultBody validateVerificationCode(@RequestBody SmsModel smsModel);
+
+    /**
+     * 发送手机短信消息
+     * @param smsModel
+     */
+    @ApiOperation(value = "发送手机短信消息接口")
+    @PostMapping("/send/smsMsg")
+    ResultBody sendSmsMsg(@RequestBody SmsModel smsModel);
+}
diff --git a/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-biz/src/main/java/com/kidgrow/sms/template/BatchSmsTemplate.java b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-biz/src/main/java/com/kidgrow/sms/template/BatchSmsTemplate.java
new file mode 100644
index 0000000..002e154
--- /dev/null
+++ b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-biz/src/main/java/com/kidgrow/sms/template/BatchSmsTemplate.java
@@ -0,0 +1,26 @@
+package com.kidgrow.sms.template;
+
+import lombok.*;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: 阿里云调用批量模板<br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/2/17 09:04 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+@Builder(builderClassName = "Builder", toBuilder = true)
+@Getter
+@Setter
+@AllArgsConstructor
+@NoArgsConstructor
+public class BatchSmsTemplate {
+    private List<String> signNames;
+    private String templateCode;
+    private List<Map<String, String>> templateParams;
+    private List<String> phoneNumbers;
+}
diff --git a/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-biz/src/main/java/com/kidgrow/sms/template/SmsTemplate.java b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-biz/src/main/java/com/kidgrow/sms/template/SmsTemplate.java
new file mode 100644
index 0000000..c943ded
--- /dev/null
+++ b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-biz/src/main/java/com/kidgrow/sms/template/SmsTemplate.java
@@ -0,0 +1,27 @@
+package com.kidgrow.sms.template;
+
+import lombok.*;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: 阿里云调用模板<br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/2/17 09:04 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+@Builder(builderClassName = "Builder", toBuilder = true)
+@Getter
+@Setter
+@AllArgsConstructor
+@NoArgsConstructor
+public class SmsTemplate {
+    private String signName;
+    private String templateCode;
+    private Map<String, String> templateParam;
+    private List<String> phoneNumbers;
+
+}
diff --git a/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-biz/src/main/java/com/kidgrow/sms/util/AliyunSmsUtils.java b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-biz/src/main/java/com/kidgrow/sms/util/AliyunSmsUtils.java
new file mode 100644
index 0000000..edf35c7
--- /dev/null
+++ b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-biz/src/main/java/com/kidgrow/sms/util/AliyunSmsUtils.java
@@ -0,0 +1,175 @@
+package com.kidgrow.sms.util;
+
+import com.aliyuncs.CommonResponse;
+import com.google.gson.Gson;
+import com.kidgrow.sms.exception.SmsException;
+import com.kidgrow.sms.template.BatchSmsTemplate;
+import com.kidgrow.sms.template.SmsTemplate;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.Collection;
+import java.util.Map;
+import java.util.concurrent.ThreadLocalRandom;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: 阿里云短信服务工具类<br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/2/17 08:53 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+public class AliyunSmsUtils {
+    private static final String SUCCESS_CODE = "OK";
+    /**
+     * 宽松校验即可.
+     */
+    private static final String PHONE_NUMBER_REGEX = "\\d{5,}";
+
+    /**
+     * 生成随机验证码.
+     *
+     * @return 随机数
+     */
+    public static int randomCode() {
+        return 100_000 + ThreadLocalRandom.current().nextInt(1_000_000 - 100_000);
+    }
+
+    /**
+     * Map 转 json 字符串的简单实现.
+     *
+     * @param map the map
+     *
+     * @return the json string
+     */
+    public static String toJsonStr(final Map<String, String> map) {
+        if (null == map || map.isEmpty()) {
+            return null;
+        }
+
+        final StringBuilder sb = new StringBuilder();
+        sb.append('{');
+        for (final Map.Entry<String, String> entry : map.entrySet()) {
+            sb.append('"')
+                    .append(entry.getKey().replace("\"", "\\\""))
+                    .append('"')
+                    .append(':')
+                    .append('"')
+                    .append(entry.getValue().replace("\"", "\\\""))
+                    .append('"')
+                    .append(',');
+        }
+        sb.deleteCharAt(sb.length() - 1);
+        sb.append('}');
+        return sb.toString();
+    }
+
+    /**
+     * 校验 SmsTemplate.
+     *
+     * @param template the SmsTemplate
+     */
+    public static void checkSmsTemplate(final SmsTemplate template) {
+
+        checkNotEmpty(template.getSignName(), "SmsTemplate signName must be not empty");
+        checkNotEmpty(template.getTemplateCode(), "SmsTemplate templateCode must be not empty");
+        checkNotEmpty(template.getPhoneNumbers(), "SmsTemplate phoneNumbers must be not empty");
+
+    }
+
+    /**
+     * 校验 BatchSmsTemplate.
+     *
+     * @param template the BatchSmsTemplate
+     */
+    public static void checkBatchSmsTemplate(final BatchSmsTemplate template) {
+
+        checkNotEmpty(template.getSignNames(), "BatchSmsTemplate signNames must be not empty");
+        checkNotEmpty(template.getPhoneNumbers(), "BatchSmsTemplate phoneNumbers must be not empty");
+        checkNotEmpty(template.getTemplateCode(), "BatchSmsTemplate templateCode must be not empty");
+        checkNotEmpty(template.getTemplateParams(), "BatchSmsTemplate templateParams must be not empty");
+
+        if (template.getSignNames().size() != template.getPhoneNumbers().size()
+                && template.getPhoneNumbers().size() != template.getTemplateParams().size()) {
+            throw new IllegalArgumentException("BatchSmsTemplate phoneNumbers, signNames, templateParams size must be the same");
+        }
+    }
+
+    /**
+     * 校验 SendSmsResponse 状态.
+     *
+     * @param response the SendSmsResponse
+     */
+    public static void checkSmsResponse(final CommonResponse response) {
+        if (null == response) {
+            throw new SmsException("Response is null");
+        }
+        final Gson gson = new Gson();
+        final Map<String, String> json = gson.fromJson(response.getData(), Map.class);
+        if (!SUCCESS_CODE.equalsIgnoreCase(json.get("Code"))) {
+            //throw new SmsException("Http status: " + response.getHttpStatus() + ", response: " + response.getData());
+            throw new SmsException(response.getData());
+        }
+    }
+
+    /**
+     * 校验手机号码(中国).
+     *
+     * @param phoneNumber the phone number
+     */
+    public static void checkPhoneNumber(final String phoneNumber) {
+        if (null == phoneNumber || !phoneNumber.matches(PHONE_NUMBER_REGEX)) {
+            throw new IllegalArgumentException("Invalid phone number");
+        }
+    }
+
+    /**  <br>     2018年3月已知
+     中国电信号段
+     133,149,153,173,177,180,181,189,199
+     中国联通号段
+     130,131,132,145,155,156,166,175,176,185,186
+     中国移动号段
+     134(0-8),135,136,137,138,139,147,150,151,152,157,158,159,178,182,183,184,187,188,198
+     其他号段
+     14号段以前为上网卡专属号段,如中国联通的是145,中国移动的是147等等。
+     虚拟运营商
+     电信:1700,1701,1702
+     移动:1703,1705,1706
+     联通:1704,1707,1708,1709,171
+     卫星通信:148(移动) 1349
+     */
+    public static boolean isMobile(String str) {
+        boolean b = false;
+        String s2="^[1](([3][0-9])|([4][5,7,9])|([5][0-9])|([6][6])|([7][3,5,6,7,8])|([8][0-9])|([9][8,9]))[0-9]{8}$";// 验证手机号
+        if(StringUtils.isNotBlank(str)){
+            return str.matches(s2);
+        }
+        return b;
+    }
+
+
+
+    /**
+     * 校验字符串不为空.
+     *
+     * @param str the str
+     * @param message the message
+     */
+    public static void checkNotEmpty(final String str, final String message) {
+        if (null == str || str.isEmpty()) {
+            throw new IllegalArgumentException(message);
+        }
+    }
+
+    /**
+     * 校验集合不为空.
+     *
+     * @param coll the Collection
+     * @param message the message
+     */
+    public static void checkNotEmpty(final Collection coll, final String message) {
+        if (null == coll || coll.isEmpty()) {
+            throw new IllegalArgumentException(message);
+        }
+    }
+}
diff --git a/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-biz/src/main/java/com/kidgrow/sms/util/SmsChuangLanUtils.java b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-biz/src/main/java/com/kidgrow/sms/util/SmsChuangLanUtils.java
new file mode 100644
index 0000000..98277bf
--- /dev/null
+++ b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-biz/src/main/java/com/kidgrow/sms/util/SmsChuangLanUtils.java
@@ -0,0 +1,63 @@
+package com.kidgrow.sms.util;
+
+import com.alibaba.fastjson.JSONObject;
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Map;
+
+public class SmsChuangLanUtils {
+    public static void main(String[] args) {
+        //短信下发
+        String sendUrl = "http://smssh1.253.com/msg/send/json";
+        Map map = new HashMap();
+        map.put("account","N2561124");//API账号
+        map.put("password","Mguj6qlRWX7b5e");//API密码
+        map.put("msg","123123");//短信内容
+        map.put("phone","18600376209");//手机号
+        map.put("report","false");//是否需要状态报告
+        JSONObject js = (JSONObject) JSONObject.toJSON(map);
+        System.out.println(sendSmsByPost(sendUrl,js.toString()));
+    }
+    public static String send(Map map,String url){
+        JSONObject js = (JSONObject) JSONObject.toJSON(map);
+        return sendSmsByPost(url,js.toString());
+
+    }
+    public static String sendSmsByPost(String path, String postContent) {
+        URL url = null;
+        try {
+            url = new URL(path);
+            HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
+            httpURLConnection.setRequestMethod("POST");
+            httpURLConnection.setConnectTimeout(10000);
+            httpURLConnection.setReadTimeout(10000);
+            httpURLConnection.setDoOutput(true);
+            httpURLConnection.setDoInput(true);
+            httpURLConnection.setRequestProperty("Charset", "UTF-8");
+            httpURLConnection.setRequestProperty("Content-Type", "application/json");
+            httpURLConnection.connect();
+            OutputStream os=httpURLConnection.getOutputStream();
+            os.write(postContent.getBytes("UTF-8"));
+            os.flush();
+            StringBuilder sb = new StringBuilder();
+            int httpRspCode = httpURLConnection.getResponseCode();
+            if (httpRspCode == HttpURLConnection.HTTP_OK) {
+                BufferedReader br = new BufferedReader(
+                        new InputStreamReader(httpURLConnection.getInputStream(), "utf-8"));
+                String line = null;
+                while ((line = br.readLine()) != null) {
+                    sb.append(line);
+                }
+                br.close();
+                return sb.toString();
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+}
\ No newline at end of file
diff --git a/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-server/src/main/java/com/kidgrow/sms/aliyun/config/SmsAutoConfiguration.java b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-server/src/main/java/com/kidgrow/sms/aliyun/config/SmsAutoConfiguration.java
new file mode 100644
index 0000000..80ffb22
--- /dev/null
+++ b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-server/src/main/java/com/kidgrow/sms/aliyun/config/SmsAutoConfiguration.java
@@ -0,0 +1,46 @@
+package com.kidgrow.sms.aliyun.config;
+
+import com.kidgrow.sms.client.SmsClient;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: 阿里云 SMS 自动配置<br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/2/17 09:11 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+@Configuration
+@ConditionalOnClass(name = "com.aliyuncs.IAcsClient")
+@EnableConfigurationProperties(SmsProperties.class)
+public class SmsAutoConfiguration {
+    private final SmsProperties smsProperties;
+
+    public SmsAutoConfiguration(final SmsProperties smsProperties) {
+        this.smsProperties = smsProperties;
+    }
+
+    /**
+     * Configuration SmsClient bean.
+     *
+     * @return the sms client
+     */
+    @Bean
+    @ConditionalOnMissingBean
+    public SmsClient smsClient() {
+        if (this.smsProperties.getTemplates() == null) {
+            return new SmsClient(this.smsProperties.getAccessKeyId(), this.smsProperties.getAccessKeySecret());
+        } else {
+            return new SmsClient(
+                    this.smsProperties.getAccessKeyId(),
+                    this.smsProperties.getAccessKeySecret(),
+                    this.smsProperties.getTemplates());
+        }
+    }
+}
+
diff --git a/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-server/src/main/java/com/kidgrow/sms/aliyun/config/SmsProperties.java b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-server/src/main/java/com/kidgrow/sms/aliyun/config/SmsProperties.java
new file mode 100644
index 0000000..103737d
--- /dev/null
+++ b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-server/src/main/java/com/kidgrow/sms/aliyun/config/SmsProperties.java
@@ -0,0 +1,37 @@
+package com.kidgrow.sms.aliyun.config;
+
+import com.kidgrow.sms.template.SmsTemplate;
+import lombok.Data;
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: 阿里云 SMS 配置属性<br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/2/17 09:10 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+@Data
+@ConfigurationProperties(prefix = "aliyun.sms")
+public class SmsProperties implements InitializingBean {
+
+    private String accessKeyId;
+    private String accessKeySecret;
+    private String signName;
+    private Map<String, SmsTemplate> templates;
+
+    @Override
+    public void afterPropertiesSet() throws Exception {
+        if (null != this.templates) {
+            for (final SmsTemplate smsTemplate : this.templates.values()) {
+                if (null == smsTemplate.getSignName()) {
+                    smsTemplate.setSignName(this.signName);
+                }
+            }
+        }
+    }
+}
diff --git a/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-server/src/main/java/com/kidgrow/sms/aliyun/controller/SmsController.java b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-server/src/main/java/com/kidgrow/sms/aliyun/controller/SmsController.java
new file mode 100644
index 0000000..af27f80
--- /dev/null
+++ b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-server/src/main/java/com/kidgrow/sms/aliyun/controller/SmsController.java
@@ -0,0 +1,133 @@
+package com.kidgrow.sms.aliyun.controller;
+
+import com.kidgrow.common.base.ResponseCode;
+import com.kidgrow.common.model.ResultBody;
+import com.kidgrow.redis.template.RedisRepository;
+import com.kidgrow.sms.client.SmsClient;
+import com.kidgrow.sms.exception.SmsException;
+import com.kidgrow.sms.service.AliyunSmsService;
+import com.kidgrow.sms.model.SmsModel;
+import com.kidgrow.sms.util.AliyunSmsUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: <br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/2/17 09:15 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+@RestController
+@RequestMapping("sms")
+public class SmsController implements AliyunSmsService {
+
+    @Autowired
+    private SmsClient smsClient;
+
+    @Autowired
+    private RedisRepository redisRepository;
+
+    @Value("${sms.verificationCode.timeOut:180}")
+    private Long timeOut;
+
+    @Value("${sms.verificationCode.prefix:default}")
+    private String smsPrefix;
+
+    /**
+     * 发送短信验证码
+     *
+     * @param smsModel
+     */
+    @Override
+    public ResultBody sendVerificationCode(@RequestBody SmsModel smsModel) {
+        String phoneNumber = smsModel.getPhoneNumber();
+        String key = smsModel.getKey();
+        if (StringUtils.isBlank(phoneNumber) || StringUtils.isBlank(key)) {
+            return ResultBody.fail(ResponseCode.ERROR_PARAMS, "手机号或短信模板不能为空!");
+        }
+        if (!AliyunSmsUtils.isMobile(phoneNumber)) {
+            return ResultBody.fail(ResponseCode.ERROR_PARAMS, "手机号格式不正确!");
+        }
+        try {
+            // 发送验证码
+            Integer code = smsClient.sendVerificationCode(key, phoneNumber);
+            // 缓存验证码和有效期
+            redisRepository.setExpire(smsPrefix + phoneNumber, code.toString(), timeOut);
+//            redisRepository.expire(smsPrefix + phoneNumber, timeOut);
+            return ResultBody.ok();
+        } catch (SmsException smsEx) {
+            smsEx.printStackTrace();
+            return ResultBody.failed().msg(smsEx.getMessage());
+        } catch (Exception e) {
+            e.printStackTrace();
+            return ResultBody.failed().msg(e.getMessage());
+        }
+    }
+
+    /**
+     * 验证码校验
+     *
+     * @param smsModel
+     */
+    @Override
+    public ResultBody validateVerificationCode(@RequestBody SmsModel smsModel) {
+        String phoneNumber = smsModel.getPhoneNumber();
+        String code = smsModel.getCode();
+        if (StringUtils.isBlank(phoneNumber) || StringUtils.isBlank(code)) {
+            return ResultBody.failed(ResponseCode.ERROR_PARAMS, "手机号或验证码不能为空!");
+        }
+        try {
+            if (redisRepository.exists(smsPrefix + phoneNumber)) {
+                String rightCode = (String) redisRepository.get(smsPrefix + phoneNumber);
+                if (code.equals(rightCode)) {
+                    // 验证成功 移除缓存验证码
+                    redisRepository.del(smsPrefix + phoneNumber);
+                    return ResultBody.ok();
+                } else {
+                    return ResultBody.failed(ResponseCode.ERROR_PARAMS, "验证码不正确!");
+                }
+            } else {
+                return ResultBody.failed(ResponseCode.ERROR_PARAMS, "验证码已失效!");
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            return ResultBody.failed("系统错误");
+        }
+    }
+
+    /**
+     * 发送手机短信消息
+     *
+     * @param smsModel
+     * @return
+     */
+    @Override
+    public ResultBody sendSmsMsg(SmsModel smsModel) {
+        List<String> phoneNumbers = smsModel.getPhoneNumbers();
+        String key = smsModel.getKey();
+//        if ((phoneNumbers == null || phoneNumbers.isEmpty()) || StringUtils.isBlank(key)) {
+//            return ResponseBuilder.buildResultError(ResponseCode.ERROR_PARAMS, "手机号或短信模板不能为空!");
+//        }
+
+        try {
+            // 发送手机短信消息
+            smsClient.sendSmsMsg(key, smsModel.getParams(), phoneNumbers);
+            return ResultBody.ok();
+        } catch (SmsException smsEx) {
+            smsEx.printStackTrace();
+            return ResultBody.failed(smsEx.getMessage());
+        } catch (Exception e) {
+            e.printStackTrace();
+            return ResultBody.failed(e.getMessage());
+        }
+    }
+}
+
diff --git a/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-server/src/main/java/com/kidgrow/sms/lanchuang/controller/SmsChuangLanController.java b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-server/src/main/java/com/kidgrow/sms/lanchuang/controller/SmsChuangLanController.java
new file mode 100644
index 0000000..12ba9dc
--- /dev/null
+++ b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-server/src/main/java/com/kidgrow/sms/lanchuang/controller/SmsChuangLanController.java
@@ -0,0 +1,156 @@
+package com.kidgrow.sms.lanchuang.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.kidgrow.common.model.ResultBody;
+import com.kidgrow.common.utils.DateUtils;
+import com.kidgrow.redis.util.RedisUtils;
+import com.kidgrow.sms.util.SmsChuangLanUtils;
+import io.swagger.annotations.Api;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.*;
+
+@RestController
+@RequestMapping("smsChangLan")
+@Api(tags = "创蓝短信模块")
+public class SmsChuangLanController {
+    @Value("${chuanglan.sms.sendUrl}")
+    private String CHUANGLAN_SMS_SENDURL;
+    @Value("${chuanglan.sms.account}")
+    private String CHUANGLAN_SMS_ACCOUNT;
+    @Value("${chuanglan.sms.password}")
+    private String CHUANGLAN_SMS_PASSWORD;
+    @Value("${chuanglan.sms.num}")
+    private Integer CHUANGLAN_SMS_NUM;
+    @Value("${chuanglan.sms.timeLimit}")
+    private Integer CHUANGLAN_SMS_TIMELIMIT;
+    @Autowired
+    private RedisUtils redisUtils;
+
+    /**
+     * type  为类型, "type":"LOGIN_SMS"  为登录,"type":"PASSWORD_SMS" 为密码找回,"type":"REGISTER_SMS" 为
+     * @param map
+     * @return
+     */
+    @PostMapping("send")
+    public ResultBody sendVerificationCode(@RequestBody Map map) {
+        if(CHUANGLAN_SMS_NUM==null){
+            CHUANGLAN_SMS_NUM=5;
+        }
+        Object phone = map.get("phone");
+        if (map.get("phone")==null||"".equals(map.get("phone"))){
+            return ResultBody.failed("请输入手机号");
+        }
+        Object type = map.get("type");
+        if (map.get("type")==null||"".equals(map.get("type"))){
+            return ResultBody.failed("请输入保存的类型");
+        }
+        String verificationCode="";
+        Random random=new Random();
+        for (int i = 0; i < 6; i++) {
+            int i1 = random.nextInt(9);
+            verificationCode+=i1;
+        }
+        try {
+            //组装发送消息的内容
+            map.put("account", CHUANGLAN_SMS_ACCOUNT);//API账号
+            map.put("password", CHUANGLAN_SMS_PASSWORD);//API密码
+            map.put("report","false");
+            map.put("msg","您好,您的验证码是"+verificationCode);
+            //在Redis中获取
+            Object hget = redisUtils.hget(map.get("type").toString(), map.get("phone").toString());
+            JSONObject jsonObject =new JSONObject();
+            Map<String,Object> cunMap=new HashMap<>();
+            cunMap.put("verificationCode",verificationCode);
+            cunMap.put("count",CHUANGLAN_SMS_NUM);//总共
+            if(hget==null){
+                String send = SmsChuangLanUtils.send(map, CHUANGLAN_SMS_SENDURL);
+                jsonObject=JSON.parseObject(send);
+                String s1 = DateUtils.formatCurrentDateTime();
+                cunMap.put("date",s1);
+                cunMap.put("remnant",CHUANGLAN_SMS_NUM-1);//剩余
+                Date date2 = DateUtils.addMilliseconds(DateUtils.parseDate(s1), CHUANGLAN_SMS_TIMELIMIT);
+                cunMap.put("endTime",DateUtils.formatDateTime(date2));
+            }else {
+                JSONObject redisJson = JSON.parseObject(JSON.toJSONString(hget));
+                Object remnantObject = redisJson.get("remnant");
+                if(remnantObject instanceof Integer){
+                    Integer remnant=(Integer)remnantObject;
+                    if(remnant>0){
+                        String send = SmsChuangLanUtils.send(map, CHUANGLAN_SMS_SENDURL);
+                        jsonObject=JSON.parseObject(send);
+                        String s1 = DateUtils.formatCurrentDateTime();
+                        cunMap.put("date",DateUtils.formatCurrentDateTime());
+                        cunMap.put("remnant",remnant-1);//剩余
+                        Date date2 = DateUtils.addMilliseconds(DateUtils.parseDate(s1), CHUANGLAN_SMS_TIMELIMIT);
+                        cunMap.put("endTime",DateUtils.formatDateTime(date2));
+                    }else{
+                        return ResultBody.failed().data("每个手机号限用"+CHUANGLAN_SMS_NUM+"次");
+                    }
+                }else {
+                    return ResultBody.failed();
+                }
+            }
+            if ("0".equals(jsonObject.get("code"))) {
+                redisUtils.hset(map.get("type").toString(), map.get("phone").toString(),cunMap,DateUtils.getSecondsNextEarlyMorning());
+//                return ResultBody.ok().data(verificationCode);
+                return ResultBody.ok();
+            } else {
+                return ResultBody.failed();
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            return ResultBody.failed();
+        }
+    }
+    @PostMapping("verification")
+    public ResultBody verification(@RequestBody Map<String,Object> map){
+        Object phone = map.get("phone");
+        if (map.get("phone")==null||"".equals(map.get("phone"))){
+            return ResultBody.failed("请输入手机号");
+        }
+        Object verificationCode = map.get("verificationCode");
+        if (map.get("verificationCode")==null||"".equals(map.get("verificationCode"))){
+            return ResultBody.failed("请输入保存的类型");
+        }
+        Object type = map.get("type");
+        if (map.get("type")==null||"".equals(map.get("type"))){
+            return ResultBody.failed("请输入保存的类型");
+        }
+        Object hget = redisUtils.hget(map.get("type").toString(), map.get("phone").toString());
+        if(hget!=null){
+            JSONObject redisJson = JSON.parseObject(JSON.toJSONString(hget));
+            Object verificationCodeObject = redisJson.get("verificationCode");
+            if(verificationCode.equals(verificationCodeObject)){
+                Object date = redisJson.get("date");
+                long time = DateUtils.addMilliseconds(DateUtils.parseDate(date.toString()), CHUANGLAN_SMS_TIMELIMIT).getTime();
+                Date dateNow=new Date();
+                long timeNow = dateNow.getTime();
+                if(timeNow<=time){
+                    return ResultBody.ok();
+                }else {
+                    return ResultBody.failed("验证码超时");
+                }
+            }else {
+                return ResultBody.failed("验证码错误");
+            }
+        }else {
+            return ResultBody.failed("该手机号没有验证码");
+        }
+    }
+    //获取 存放 Redis的时间 秒(到今晚的秒数)
+    public Long getSecondsNextEarlyMorning() {
+        Date afterDay = DateUtils.getAfterDay(new Date());
+        String s = DateUtils.formatDate(afterDay, null);
+        Date date = DateUtils.parseDate(s);
+        System.out.println(date.getTime()-System.currentTimeMillis());
+        long second= (date.getTime()-System.currentTimeMillis())/1000;
+        return second;
+    }
+}
diff --git a/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-server/src/main/resources/application.yml b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-server/src/main/resources/application.yml
index 9f1d5ad..ced8b2c 100644
--- a/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-server/src/main/resources/application.yml
+++ b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-server/src/main/resources/application.yml
@@ -37,6 +37,7 @@
 
 
 
+
 kidgrow:
   #  fdfs:
   #    web-url: 192.168.28.130
@@ -87,3 +88,38 @@
 #  trackerList: ${kidgrow.fdfs.trackerList}
 
 
+#创蓝
+chuanglan:
+  sms:
+    sendUrl: http://smssh1.253.com/msg/send/json
+    account: N2561124
+    password: Mguj6qlRWX7b5e
+    num: 5
+    timeLimit: 720000
+#阿里云相关
+aliyun:
+  sms:
+    accessKeyId: LTAIX1whVSBUUKNW
+    accessKeySecret: j7UywJDoUkPRvGafKrik1pyYtEC2ys
+    signName: 微课堂
+    templates:
+      ### 模板key
+      key1:
+        ## 模板code 需要在阿里云控制台设置
+        templateCode: SMS_151231928 # 与阿里云设置的保持一致,模板内容需在后面加上,方便使用:****
+      key2:
+        templateCode: SMS_105665033 # 与阿里云设置的保持一致,模板内容需在后面加上,方便使用:****
+  commonRequest:
+    domain: dysmsapi.aliyuncs.com
+    ## 版本号
+    version: 2017-05-25
+    ##
+    action: SendSms
+
+## 短信验证码过期时间,时间单位/秒
+sms:
+  verificationCode:
+    ## 短信验证码过期时间,时间单位/秒
+    timeOut: 120
+    ##  缓存手机号key值前缀
+    prefix: "sms:aliyun:code:"
\ No newline at end of file

--
Gitblit v1.8.0