Commit 51751a82 by 宋振民

feat:短信验证功能

parent 26426cd4
#### \u6D4B\u8BD5\u73AF\u5883 ################################################### #### \u6D4B\u8BD5\u73AF\u5883 ###################################################
spring.datasource.url=jdbc:mysql://192.168.18.176:3306/scml_sy2.0?useUnicode=true&characterEncoding=utf8&useSSL=false&autoReconnect=true&rewriteBatchedStatements=TRUE&serverTimezone=UTC spring.datasource.url=jdbc:mysql://192.168.18.176:3306/scml_sy2.1_org?useUnicode=true&characterEncoding=utf8&useSSL=false&autoReconnect=true&rewriteBatchedStatements=TRUE&serverTimezone=UTC
spring.datasource.username=root spring.datasource.username=root
spring.datasource.password=Suvalue2016 spring.datasource.password=Suvalue2016
spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.driver-class-name=com.mysql.jdbc.Driver
# Redis\u6570\u636E\u5E93\u7D22\u5F15\uFF08\u9ED8\u8BA40\uFF09 # Redis\u6570\u636E\u5E93\u7D22\u5F15\uFF08\u9ED8\u8BA40\uFF09
spring.redis.database=0 spring.redis.database=1
spring.redis.host=192.168.18.166 spring.redis.host=192.168.18.166
spring.redis.port=6379 spring.redis.port=6379
spring.redis.password=ll123456 spring.redis.password=ll123456
......
...@@ -2,4 +2,5 @@ package com.hs.api.common; ...@@ -2,4 +2,5 @@ package com.hs.api.common;
public interface Constants { public interface Constants {
String TOKEN_KEY = "Authorization"; String TOKEN_KEY = "Authorization";
String LOCAL_HOST = "127.0.0.1";
} }
package com.hs.api.common.utils;
import lombok.extern.slf4j.Slf4j;
import java.util.Map;
/**
* @author Chris
*/
@Slf4j
public class SmsUtil {
/**
* 替换成自己申请的accessKeyId
*/
private static String accessKeyId = "LTAI4GHw8BMP1RhZwYKedBRu";
/**
* 替换成自己申请的accessKeySecret
*/
private static String accessKeySecret = "1F5zjL1Ke4DIHVklZmOygnx5z2yKpA";
static final String product = "Dismays";
static final String domain = "dismays.aliens.com";
/**
* 发送短信
*
* @param phoneNumber 要发送短信到哪个手机号
* @param param 模板中${code}位置传递的内容
*/
public static boolean sendSms(String phoneNumber, Map<String,String> param) {
try {
if (false) {
log.info("发送短信失败,{}", "");
throw new RuntimeException("");
}else {
System.out.println("您本次登录验证码为:" + param.get("code") + ",5分钟内有效。");
log.info("短信发送成功");
}
} catch (Exception e) {
log.info("发送短信失败,{}", e);
throw new RuntimeException("发送短信失败");
}
return true;
}
}
...@@ -8,6 +8,7 @@ import com.hs.api.model.reqmodel.UpdatePass; ...@@ -8,6 +8,7 @@ import com.hs.api.model.reqmodel.UpdatePass;
import com.hs.api.model.respmodel.LoginInfo; import com.hs.api.model.respmodel.LoginInfo;
import com.hs.api.service.LoginService; import com.hs.api.service.LoginService;
import com.hs.api.service.UserService; import com.hs.api.service.UserService;
import com.hs.api.service.VerificationCodeService;
import com.hs.common.utils.HttpUtil; import com.hs.common.utils.HttpUtil;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
...@@ -15,6 +16,7 @@ import org.springframework.beans.factory.annotation.Autowired; ...@@ -15,6 +16,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import springfox.documentation.annotations.ApiIgnore; import springfox.documentation.annotations.ApiIgnore;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
@RestController @RestController
...@@ -25,6 +27,9 @@ public class LoginController { ...@@ -25,6 +27,9 @@ public class LoginController {
@Autowired @Autowired
private LoginService loginServiceImpl; private LoginService loginServiceImpl;
@Resource
private VerificationCodeService verificationCodeService;
@Autowired @Autowired
private UserService userService; private UserService userService;
...@@ -49,6 +54,17 @@ public class LoginController { ...@@ -49,6 +54,17 @@ public class LoginController {
return Result.success(loginfo); return Result.success(loginfo);
} }
@PostMapping("sendSmsCode")
@ApiOperation(value = "Result«LoginService.LoginInfo»登录")
public Result sendSmsCode(@RequestBody CodeAndPwd codeAndPwd, HttpServletRequest request) {
String logName = codeAndPwd.getLoginName();
String ip = HttpUtil.getIP(request);
String code = verificationCodeService.generateVerificationCode();
verificationCodeService.sendVerificationCode(ip, logName, code);
System.out.println(code);
return Result.success(code);
}
@PostMapping("pass") @PostMapping("pass")
@ApiOperation(value = "修改密码") @ApiOperation(value = "修改密码")
public Result updatePass(@RequestBody UpdatePass request) { public Result updatePass(@RequestBody UpdatePass request) {
......
package com.hs.api.controller;
import com.hs.api.common.Result;
import com.hs.api.model.reqmodel.SmsReq;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author Chris
*/
@Api(tags = "短信Api")
@RestController
public class SmsController {
/**
* 根据用户发送短信验证码
*
* @return
*/
@PostMapping("/sendSms")
@ApiOperation("发送短信接口")
public Object sendSms(SmsReq req) {
return Result.success("");
}
}
package com.hs.api.model.reqmodel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
/**
* @author Chris
*/
@Data
public class SmsReq {
@NotNull(message = "用户名不能为空")
@ApiModelProperty("用户名")
String userName;
@NotNull(message = "密码不能为空")
@ApiModelProperty("密码")
String password;
@ApiModelProperty("其他参数")
String param;
}
package com.hs.api.service.Impl;
import com.hs.api.common.utils.SmsUtil;
import com.hs.api.model.SerDepartment;
import com.hs.api.service.SmsService;
import java.util.Collection;
import java.util.List;
import java.util.Map;
/**
* @author Chris
*/
public class SmsServiceImpl implements SmsService {
@Override
public List<SerDepartment> getList(Integer date) {
return null;
}
@Override
public void sendSms(Collection<String> phoneNumbers, String param) {
//TODO
}
@Override
public boolean sendVerificationCOde(String phoneNumber, Map param) {
SmsUtil.sendSms(phoneNumber, param);
return true;
}
}
package com.hs.api.service.Impl;
import com.hs.api.common.Constants;
import com.hs.api.common.utils.SmsUtil;
import com.hs.api.model.SysUser;
import com.hs.api.service.UserService;
import com.hs.api.service.VerificationCodeService;
import com.hs.common.utils.HttpUtil;
import com.hs.common.utils.RedisUtil;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.text.NumberFormat;
import java.util.HashMap;
import java.util.Map;
/**
* @author Chris
*/
@Service
public class VerificationCodeServiceImpl implements VerificationCodeService {
@Resource
private UserService userServiceImpl;
@Override
public String generateVerificationCode() {
NumberFormat format = NumberFormat.getInstance();
format.setGroupingUsed(false);
format.setMaximumIntegerDigits(6);
format.setMinimumIntegerDigits(6);
return format.format((int)((Math.random()*9+1)*100000));
}
@Override
public boolean send(String phoneNumber, String code) {
Map<String,String> param = new HashMap<>();
if(RedisUtil.hasKey(phoneNumber) && RedisUtil.getExpire(phoneNumber)>4*60) {
long expire = RedisUtil.getExpire(phoneNumber);
long remainTime = 60- (5 * 60 - expire);
throw new RuntimeException("请于" + remainTime + "秒后重发");
}
RedisUtil.del(phoneNumber);
RedisUtil.set(phoneNumber, code, 5*60);
param.put("code", code);
SmsUtil.sendSms(phoneNumber, param);
return true;
}
@Override
public boolean sendVerificationCode(String ip, String logName, String code) {
boolean internalIp = HttpUtil.internalIp(ip);
SysUser user = userServiceImpl.findByLoginName(logName);
//if(!internalIp && !ip.equals(Constants.LOCAL_HOST)) {
String mobile = user.getMobile();
send(mobile, code);
//}
return true;
}
@Override
public boolean checkVerificationCod(String logName, String code) {
SysUser user = userServiceImpl.findByLoginName(logName);
String phoneNumber = user.getMobile();
if(RedisUtil.hasKey(phoneNumber) && code.equals(RedisUtil.get(phoneNumber))) {
return true;
}else {
return false;
}
}
}
package com.hs.api.service;
import com.hs.api.model.SerDepartment;
import java.util.Collection;
import java.util.List;
import java.util.Map;
/**
* @author Chris
*/
public interface SmsService {
/**
* 获取短信列表
* @param date
* @return List<SerDepartment>
*/
List<SerDepartment> getList(Integer date);
/**
* 发送短信
* @param phoneNumbers
* 手机号列表
* @param param
* 其他参数
*/
void sendSms(Collection<String> phoneNumbers, String param);
/**
* 发送短信验证码
* @param phoneNumber
* 手机号
* @param param
* 其他参数
* @return boolean
*/
boolean sendVerificationCOde(String phoneNumber, Map<String,String> param);
}
package com.hs.api.service;
/**
* @author Chris
*/
public interface VerificationCodeService {
/**
* 生成验证码
* @return String
*/
String generateVerificationCode();
/**
* 发送验证码
* @param phoneNumber
* 手机号
* @param code
* 验证码
* @return
*/
boolean send(String phoneNumber, String code);
/**
* 根据用户token发送验证码
* @param ip
* @param logName
* @param code
* @return
*/
boolean sendVerificationCode(String ip, String logName, String code);
/**
* 校验验证码是否一致
* @param logName
* @param code
* @return
*/
boolean checkVerificationCod(String logName, String code);
}
...@@ -10,9 +10,9 @@ project.path=localhost ...@@ -10,9 +10,9 @@ project.path=localhost
# Redis\u6570\u636E\u5E93\u7D22\u5F15\uFF08\u9ED8\u8BA40\uFF09 # Redis\u6570\u636E\u5E93\u7D22\u5F15\uFF08\u9ED8\u8BA40\uFF09
spring.redis.database=1 spring.redis.database=1
spring.redis.host=127.0.0.1 spring.redis.host=192.168.18.166
spring.redis.port=7379 spring.redis.port=6379
spring.redis.password=123456 spring.redis.password=ll123456
spring.redis.jedis.pool.max-active=8 spring.redis.jedis.pool.max-active=8
# \u8FDE\u63A5\u6C60\u6700\u5927\u963B\u585E\u7B49\u5F85\u65F6\u95F4\uFF08\u4F7F\u7528\u8D1F\u503C\u8868\u793A\u6CA1\u6709\u9650\u5236\uFF09 # \u8FDE\u63A5\u6C60\u6700\u5927\u963B\u585E\u7B49\u5F85\u65F6\u95F4\uFF08\u4F7F\u7528\u8D1F\u503C\u8868\u793A\u6CA1\u6709\u9650\u5236\uFF09
spring.redis.jedis.pool.max-wait=-1 spring.redis.jedis.pool.max-wait=-1
......
spring.application.name=hs spring.application.name=hs
spring.profiles.active=test spring.profiles.active=test
server.servlet.context-path=/drgsHospital
mybatis.mapper-locations=classpath:mapper/*.xml mybatis.mapper-locations=classpath:mapper/*.xml
mybatis.type-aliases-package=com.hs.api.model mybatis.type-aliases-package=com.hs.api.model
...@@ -11,8 +12,15 @@ server.compression.mime-types=application/json ...@@ -11,8 +12,15 @@ server.compression.mime-types=application/json
spring.mvc.servlet.load-on-startup=1 spring.mvc.servlet.load-on-startup=1
config.path.include[0]=/token config.path.include[0]=/token
config.path.include[1]=/user/** config.path.include[1]=/dept/**
config.path.include[2]=/budget/**
config.path.include[3]=/user/**
config.path.include[4]=/dimValue
config.path.include[5]=/export
config.path.include[6]=/disease/**
config.path.include[7]=/blockValuesNew
config.path.exclude[0]=/login config.path.exclude[0]=/login
config.path.exclude[1]=/user/init
# Add @EnableAspectJAutoProxy. # Add @EnableAspectJAutoProxy.
spring.aop.auto=true spring.aop.auto=true
......
...@@ -22,7 +22,7 @@ ...@@ -22,7 +22,7 @@
#{ip,jdbcType=VARCHAR}, #{moduleCode,jdbcType=VARCHAR}, #{operateType,jdbcType=DECIMAL}, #{describe,jdbcType=VARCHAR} #{ip,jdbcType=VARCHAR}, #{moduleCode,jdbcType=VARCHAR}, #{operateType,jdbcType=DECIMAL}, #{describe,jdbcType=VARCHAR}
) )
</insert> </insert>
<select id="selectAll" resultMap="BaseResultMap"> <select id="getAllAuditLogs" resultMap="BaseResultMap">
select * select *
from audit_log from audit_log
</select> </select>
......
package com.hs.common.utils; package com.hs.common.utils;
import sun.net.util.IPAddressUtil;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
public class HttpUtil { public class HttpUtil {
...@@ -20,4 +22,40 @@ public class HttpUtil { ...@@ -20,4 +22,40 @@ public class HttpUtil {
} }
return ip; return ip;
} }
public static boolean internalIp(String ip) {
byte[] addr = IPAddressUtil.textToNumericFormatV4(ip);
return internalIp(addr);
}
public static boolean internalIp(byte[] addr) {
final byte b0 = addr[0];
final byte b1 = addr[1];
//10.x.x.x/8
final byte SECTION_1 = 0x0A;
//172.16.x.x/12
final byte SECTION_2 = (byte) 0xAC;
final byte SECTION_3 = (byte) 0x10;
final byte SECTION_4 = (byte) 0x1F;
//192.168.x.x/16
final byte SECTION_5 = (byte) 0xC0;
final byte SECTION_6 = (byte) 0xA8;
switch (b0) {
case SECTION_1:
return true;
case SECTION_2:
if (b1 >= SECTION_3 && b1 <= SECTION_4) {
return true;
}
case SECTION_5:
switch (b1) {
case SECTION_6:
return true;
}
default:
return false;
}
}
} }
...@@ -16,10 +16,10 @@ ...@@ -16,10 +16,10 @@
<module>hs-common</module> <module>hs-common</module>
<module>hs-api</module> <module>hs-api</module>
<module>hs-admin</module> <module>hs-admin</module>
<module>suvalue-boot-upms</module> <!--<module>suvalue-boot-upms</module>
<module>suvalue-boot-ucenter</module> <module>suvalue-boot-ucenter</module>
<module>suvalue-boot-dynamic-datasource</module> <module>suvalue-boot-dynamic-datasource</module>
<module>suvalue-boot-demo</module> <module>suvalue-boot-demo</module>-->
<module>hs-plugins</module> <module>hs-plugins</module>
</modules> </modules>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment