Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
S
sv-springboot
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
bsoft
sv-springboot
Commits
51751a82
Commit
51751a82
authored
Mar 18, 2021
by
宋振民
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
feat:短信验证功能
parent
26426cd4
Show whitespace changes
Inline
Side-by-side
Showing
15 changed files
with
354 additions
and
9 deletions
+354
-9
hs-admin/src/main/resources/application-test.properties
+2
-2
hs-api/src/main/java/com/hs/api/common/Constants.java
+1
-0
hs-api/src/main/java/com/hs/api/common/utils/SmsUtil.java
+47
-0
hs-api/src/main/java/com/hs/api/controller/LoginController.java
+16
-0
hs-api/src/main/java/com/hs/api/controller/SmsController.java
+28
-0
hs-api/src/main/java/com/hs/api/model/reqmodel/SmsReq.java
+23
-0
hs-api/src/main/java/com/hs/api/service/Impl/SmsServiceImpl.java
+33
-0
hs-api/src/main/java/com/hs/api/service/Impl/VerificationCodeServiceImpl.java
+74
-0
hs-api/src/main/java/com/hs/api/service/SmsService.java
+38
-0
hs-api/src/main/java/com/hs/api/service/VerificationCodeService.java
+39
-0
hs-api/src/main/resources/application-test.properties
+3
-3
hs-api/src/main/resources/application.properties
+9
-1
hs-api/src/main/resources/mapper/AuditLogMapper.xml
+1
-1
hs-common/src/main/java/com/hs/common/utils/HttpUtil.java
+38
-0
pom.xml
+2
-2
No files found.
hs-admin/src/main/resources/application-test.properties
View file @
51751a82
#### \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
...
...
hs-api/src/main/java/com/hs/api/common/Constants.java
View file @
51751a82
...
@@ -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"
;
}
}
hs-api/src/main/java/com/hs/api/common/utils/SmsUtil.java
0 → 100644
View file @
51751a82
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
;
}
}
hs-api/src/main/java/com/hs/api/controller/LoginController.java
View file @
51751a82
...
@@ -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
)
{
...
...
hs-api/src/main/java/com/hs/api/controller/SmsController.java
0 → 100644
View file @
51751a82
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
(
""
);
}
}
hs-api/src/main/java/com/hs/api/model/reqmodel/SmsReq.java
0 → 100644
View file @
51751a82
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
;
}
hs-api/src/main/java/com/hs/api/service/Impl/SmsServiceImpl.java
0 → 100644
View file @
51751a82
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
;
}
}
hs-api/src/main/java/com/hs/api/service/Impl/VerificationCodeServiceImpl.java
0 → 100644
View file @
51751a82
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
;
}
}
}
hs-api/src/main/java/com/hs/api/service/SmsService.java
0 → 100644
View file @
51751a82
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
);
}
hs-api/src/main/java/com/hs/api/service/VerificationCodeService.java
0 → 100644
View file @
51751a82
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
);
}
hs-api/src/main/resources/application-test.properties
View file @
51751a82
...
@@ -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
=
1
27.0.0.1
spring.redis.host
=
1
92.168.18.166
spring.redis.port
=
7
379
spring.redis.port
=
6
379
spring.redis.password
=
123456
spring.redis.password
=
ll
123456
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
...
...
hs-api/src/main/resources/application.properties
View file @
51751a82
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
...
...
hs-api/src/main/resources/mapper/AuditLogMapper.xml
View file @
51751a82
...
@@ -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>
...
...
hs-common/src/main/java/com/hs/common/utils/HttpUtil.java
View file @
51751a82
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
;
}
}
}
}
pom.xml
View file @
51751a82
...
@@ -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>
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment