Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
cfld-region-outline
Project
Project
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
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
cfld-backend
cfld-region-outline
Commits
9102f3c8
Commit
9102f3c8
authored
Dec 12, 2023
by
lixinglin
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'origin/master'
parents
3024efaf
5a0e7963
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
48 changed files
with
1685 additions
and
67 deletions
+1685
-67
pom.xml
pom.xml
+18
-0
CarrierInfoTypeListVO.java
src/main/java/com/lyy/admin/VO/CarrierInfoTypeListVO.java
+24
-0
ParkInfoAllVO.java
src/main/java/com/lyy/admin/VO/ParkInfoAllVO.java
+3
-1
SendPhoneVo.java
src/main/java/com/lyy/admin/VO/sms/SendPhoneVo.java
+31
-0
SmsVo.java
src/main/java/com/lyy/admin/VO/sms/SmsVo.java
+37
-0
Decrypt.java
src/main/java/com/lyy/admin/common/anno/Decrypt.java
+19
-0
Encrypt.java
src/main/java/com/lyy/admin/common/anno/Encrypt.java
+17
-0
ResourceConfig.java
...main/java/com/lyy/admin/common/config/ResourceConfig.java
+21
-8
SmsConfig.java
src/main/java/com/lyy/admin/common/config/SmsConfig.java
+29
-0
WebClientConfig.java
...ain/java/com/lyy/admin/common/config/WebClientConfig.java
+16
-0
Constants.java
src/main/java/com/lyy/admin/common/constant/Constants.java
+14
-2
RedisConstants.java
...in/java/com/lyy/admin/common/constant/RedisConstants.java
+27
-0
DecryptRequest.java
...ain/java/com/lyy/admin/common/encrypt/DecryptRequest.java
+91
-0
EncrptResponse.java
...ain/java/com/lyy/admin/common/encrypt/EncrptResponse.java
+69
-0
LiyerenException.java
...java/com/lyy/admin/common/exception/LiyerenException.java
+33
-0
LoginInterceptor.java
...va/com/lyy/admin/common/interceptor/LoginInterceptor.java
+21
-3
RedisConfig.java
src/main/java/com/lyy/admin/common/redis/RedisConfig.java
+46
-0
AjaxResult.java
src/main/java/com/lyy/admin/common/utils/AjaxResult.java
+4
-2
BusinessService.java
...main/java/com/lyy/admin/common/utils/BusinessService.java
+38
-0
GlobalExceptionHandler.java
...va/com/lyy/admin/common/utils/GlobalExceptionHandler.java
+28
-2
IpUtils.java
src/main/java/com/lyy/admin/common/utils/IpUtils.java
+208
-0
SendMsgUtils.java
src/main/java/com/lyy/admin/common/utils/SendMsgUtils.java
+0
-0
RedisUtil.java
...main/java/com/lyy/admin/common/utils/redis/RedisUtil.java
+330
-0
WeixinController.java
src/main/java/com/lyy/admin/controller/WeixinController.java
+30
-1
ApiController.java
...main/java/com/lyy/admin/controller/api/ApiController.java
+46
-0
SysSmsLogEntity.java
...ain/java/com/lyy/admin/domain/smslog/SysSmsLogEntity.java
+47
-0
SysCarouselInfo.java
...ain/java/com/lyy/admin/domain/system/SysCarouselInfo.java
+7
-0
BusinessTypeEnum.java
src/main/java/com/lyy/admin/enumerate/BusinessTypeEnum.java
+30
-0
SendMsgTypeEnum.java
src/main/java/com/lyy/admin/enumerate/SendMsgTypeEnum.java
+44
-0
ThreadSourceEnum.java
src/main/java/com/lyy/admin/enumerate/ThreadSourceEnum.java
+18
-0
UrlTypeEnum.java
src/main/java/com/lyy/admin/enumerate/UrlTypeEnum.java
+33
-0
SysSmsLogMapper.java
src/main/java/com/lyy/admin/mapper/sms/SysSmsLogMapper.java
+14
-0
DevelopmentInfoServiceImpl.java
...vice/developmentinfo/impl/DevelopmentInfoServiceImpl.java
+13
-11
SysUserInfoServiceImpl.java
...va/com/lyy/admin/service/impl/SysUserInfoServiceImpl.java
+8
-0
LiyerenService.java
...java/com/lyy/admin/service/liyerenapi/LiyerenService.java
+19
-0
LiyerenServiceImpl.java
...lyy/admin/service/liyerenapi/impl/LiyerenServiceImpl.java
+120
-0
ParkInfoServiceImpl.java
.../lyy/admin/service/parkinfo/impl/ParkInfoServiceImpl.java
+21
-15
IMessage.java
src/main/java/com/lyy/admin/service/sms/IMessage.java
+0
-10
SysSmsLogService.java
...main/java/com/lyy/admin/service/sms/SysSmsLogService.java
+15
-0
SysSmsLogServiceImpl.java
.../com/lyy/admin/service/sms/impl/SysSmsLogServiceImpl.java
+16
-0
SysCarouselInfoService.java
.../com/lyy/admin/service/system/SysCarouselInfoService.java
+2
-0
SysCarouselInfoServiceImpl.java
...admin/service/system/impl/SysCarouselInfoServiceImpl.java
+31
-0
application-dev.yml
src/main/resources/application-dev.yml
+6
-2
application-local.yml
src/main/resources/application-local.yml
+6
-2
application-prod.yml
src/main/resources/application-prod.yml
+6
-2
application-test.yml
src/main/resources/application-test.yml
+7
-3
application.yml
src/main/resources/application.yml
+16
-3
SysSmsLogMapper.xml
src/main/resources/mapper/sms/SysSmsLogMapper.xml
+6
-0
No files found.
pom.xml
View file @
9102f3c8
...
...
@@ -164,6 +164,24 @@
<artifactId>
gson
</artifactId>
<version>
2.9.0
</version>
</dependency>
<dependency>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter-webflux
</artifactId>
</dependency>
<dependency>
<groupId>
org.hibernate
</groupId>
<artifactId>
hibernate-validator
</artifactId>
<version>
5.2.0.Final
</version>
</dependency>
<!--启用Spring Boot的配置处理器。-->
<dependency>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-configuration-processor
</artifactId>
<optional>
true
</optional>
</dependency>
</dependencies>
<build>
...
...
src/main/java/com/lyy/admin/VO/CarrierInfoTypeListVO.java
0 → 100644
View file @
9102f3c8
package
com
.
lyy
.
admin
.
VO
;
import
io.swagger.annotations.ApiModel
;
import
io.swagger.annotations.ApiModelProperty
;
import
lombok.Data
;
import
java.io.Serializable
;
import
java.math.BigDecimal
;
import
java.util.Date
;
/**
*
* @TableName carrier_info
*/
@Data
@ApiModel
(
value
=
"载体类型列表信息"
,
description
=
"载体类型列表信息"
)
public
class
CarrierInfoTypeListVO
implements
Serializable
{
@ApiModelProperty
(
value
=
"产品类型"
)
private
String
type
;
private
static
final
long
serialVersionUID
=
1L
;
}
\ No newline at end of file
src/main/java/com/lyy/admin/VO/ParkInfoAllVO.java
View file @
9102f3c8
package
com
.
lyy
.
admin
.
VO
;
import
cn.hutool.json.JSONArray
;
import
com.lyy.admin.domain.carrierinfo.CarrierInfo
;
import
com.lyy.admin.domain.parkinfo.ParkCarrierInfo
;
import
com.lyy.admin.domain.parkinfo.ParkInvestmentDirectionInfo
;
import
com.lyy.admin.domain.parkinfo.ParkSewageInfo
;
...
...
@@ -22,7 +23,7 @@ public class ParkInfoAllVO implements Serializable {
private
JSONArray
parkTrafficInfoVOs
=
new
JSONArray
();
private
List
<
String
>
parkCarrierInfo
=
new
ArrayList
<>();
private
List
<
SysCarouselInfo
>
sysCarouselInfos
=
new
ArrayList
<>();
private
List
<
CarrierInfoListVO
>
carrierInfoVO
=
new
ArrayList
<>();
private
List
<
CarrierInfo
Type
ListVO
>
carrierInfoVO
=
new
ArrayList
<>();
private
List
<
ParkInvestmentDirectionInfo
>
parkInvestmentDirectionInfos
=
new
ArrayList
<>();
private
static
final
long
serialVersionUID
=
1L
;
}
\ No newline at end of file
src/main/java/com/lyy/admin/VO/sms/SendPhoneVo.java
0 → 100644
View file @
9102f3c8
package
com
.
lyy
.
admin
.
VO
.
sms
;
import
io.swagger.annotations.ApiModel
;
import
io.swagger.annotations.ApiModelProperty
;
import
lombok.*
;
import
org.hibernate.validator.constraints.NotBlank
;
import
javax.validation.constraints.NotNull
;
import
javax.validation.constraints.Pattern
;
/**
* @Author:zhouxudong
* @version: 1.0
* @Date: 2023/11/17 9:14
* @Description: 发送短信 vo
*/
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@ToString
@ApiModel
(
value
=
"发送短信"
)
public
class
SendPhoneVo
{
@ApiModelProperty
(
value
=
"手机号"
,
required
=
true
)
private
String
phone
;
//发送短信的类型 1:注册 2:登录
@ApiModelProperty
(
value
=
"短信类型 传数字 1:注册 2:登录 3:忘记密码 4:修改密码"
,
required
=
true
)
private
Integer
type
;
@ApiModelProperty
(
value
=
"验证码信息不能为空,六位数字"
,
required
=
true
)
private
Integer
code
;
}
src/main/java/com/lyy/admin/VO/sms/SmsVo.java
0 → 100644
View file @
9102f3c8
package
com
.
lyy
.
admin
.
VO
.
sms
;
import
lombok.*
;
import
java.util.List
;
/**
* @Author:zhouxudong
* @version: 1.0
* @Date: 2023/11/20 14:38
* @Description: 短信返回格式
*/
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@ToString
public
class
SmsVo
{
private
String
code
;
private
String
description
;
private
List
<
Object
>
result
;
//返回样例
/* {
"result": [{
"total": 1,
"originTo": "18731081812",
"createTime": "2023-11-20T06:05:08Z",
"from": "8823112010314",
"smsMsgId": "0521b98d-75ae-467f-9672-8a9707095e67_28147916",
"countryId": "CN",
"status": "000000"
}],
"code": "000000",
"description": "Success"
}*/
}
src/main/java/com/lyy/admin/common/anno/Decrypt.java
0 → 100644
View file @
9102f3c8
package
com
.
lyy
.
admin
.
common
.
anno
;
import
java.lang.annotation.ElementType
;
import
java.lang.annotation.Retention
;
import
java.lang.annotation.RetentionPolicy
;
import
java.lang.annotation.Target
;
/**
* @Author:zhouxudong
* @version: 1.0
* @Date: 2023/12/12 9:40
* @Description: 解密注解
*/
@Retention
(
RetentionPolicy
.
RUNTIME
)
@Target
({
ElementType
.
METHOD
,
ElementType
.
PARAMETER
})
public
@interface
Decrypt
{
}
src/main/java/com/lyy/admin/common/anno/Encrypt.java
0 → 100644
View file @
9102f3c8
package
com
.
lyy
.
admin
.
common
.
anno
;
import
java.lang.annotation.ElementType
;
import
java.lang.annotation.Retention
;
import
java.lang.annotation.RetentionPolicy
;
import
java.lang.annotation.Target
;
/**
* @Author:zhouxudong
* @version: 1.0
* @Date: 2023/12/12 9:40
* @Description: 加密注解
*/
@Target
(
ElementType
.
METHOD
)
@Retention
(
RetentionPolicy
.
RUNTIME
)
public
@interface
Encrypt
{
}
src/main/java/com/lyy/admin/common/config/ResourceConfig.java
View file @
9102f3c8
package
com
.
lyy
.
admin
.
common
.
config
;
import
com.lyy.admin.common.constant.Constants
;
import
com.lyy.admin.common.interceptor.LoginInterceptor
;
import
org.apache.commons.lang3.ArrayUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.context.annotation.Bean
;
import
org.springframework.context.annotation.Configuration
;
import
org.springframework.http.CacheControl
;
import
org.springframework.web.cors.CorsConfiguration
;
import
org.springframework.web.cors.UrlBasedCorsConfigurationSource
;
import
org.springframework.web.filter.CorsFilter
;
import
org.springframework.web.servlet.config.annotation.InterceptorRegistry
;
import
org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry
;
import
org.springframework.web.servlet.config.annotation.WebMvcConfigurer
;
import
java.util.concurrent.TimeUnit
;
/**
* @author yaobaizheng
* @desc 解决跨域问题
...
...
@@ -49,9 +44,7 @@ public class ResourceConfig implements WebMvcConfigurer {
public
void
addInterceptors
(
InterceptorRegistry
registry
)
{
if
(
lyyConfig
.
getEnableUrlFilter
()){
String
[]
excludeSwagger
=
new
String
[]{
"/swagger-resources/**"
,
"/webjars/**"
,
"/v2/**"
,
"/v3/**"
,
"/swagger-ui.html/**"
,
"/api"
,
"/api-docs"
,
"/api-docs/**"
,
"/doc.html/**"
};
String
[]
excludeSwagger
=
excludeSwagger
();
String
[]
excludeUrl
=
new
String
[]{
"/demo/login"
,
"/login/login"
,
"/weixin/login"
,
"/parkInfo/list"
,
"/developmentInfo/list"
,
"/megalopolisInfo/list"
,
...
...
@@ -65,6 +58,26 @@ public class ResourceConfig implements WebMvcConfigurer {
}
}
private
String
[]
excludeSwagger
(){
String
[]
excludeSwagger
=
new
String
[]{
"/swagger-resources/**"
,
"/swagger-ui.html"
,
"/webjars/**"
,
"/v3/**"
,
"/v2/**"
,
"/swagger**/**"
,
"/error"
,
"/swagger-ui/index.html"
,
"/swagger-ui/index.html/**"
,
"/doc.html"
,
"doc.html/**"
,
"/doc.html#/**"
,
"/**/login"
,
"/favicon.ico"
,
"/favicon.ico/**"
,
"/swagger-ui.html/**"
};
return
excludeSwagger
;
}
/**
* 跨域配置
*/
...
...
src/main/java/com/lyy/admin/common/config/SmsConfig.java
0 → 100644
View file @
9102f3c8
package
com
.
lyy
.
admin
.
common
.
config
;
import
lombok.*
;
import
org.springframework.boot.context.properties.ConfigurationProperties
;
import
org.springframework.stereotype.Component
;
/**
* @Author:zhouxudong
* @version: 1.0
* @Date: 2023/11/17 10:54
* @Description:
*/
@Component
@ConfigurationProperties
(
prefix
=
"sms"
)
@Getter
@Setter
@ToString
@AllArgsConstructor
@NoArgsConstructor
public
class
SmsConfig
{
private
String
appKey
;
private
String
appSecret
;
//app接入地址 //APP接入地址(在控制台"应用管理"页面获取)+接口访问URI
private
String
appUrl
;
/** 签名通道号 //国内短信签名通道号*/
private
String
sender
;
/** 短信签名 国内短信关注,当templateId指定的模板类型为通用模板时生效且必填,必须是已审核通过的,与模板类型一致的签名名称*/
private
String
signature
;
}
src/main/java/com/lyy/admin/common/config/WebClientConfig.java
0 → 100644
View file @
9102f3c8
package
com
.
lyy
.
admin
.
common
.
config
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.context.annotation.Bean
;
import
org.springframework.context.annotation.Configuration
;
import
org.springframework.web.reactive.function.client.WebClient
;
@Configuration
@Slf4j
public
class
WebClientConfig
{
@Bean
public
WebClient
webClient
()
{
return
WebClient
.
builder
().
build
();
}
}
src/main/java/com/lyy/admin/common/constant/Constants.java
View file @
9102f3c8
...
...
@@ -110,4 +110,17 @@ public class Constants {
*/
public
static
final
String
[]
JOB_ERROR_STR
=
{
"java.net.URL"
,
"javax.naming.InitialContext"
,
"org.yaml.snakeyaml"
,
"org.springframework"
,
"org.apache"
,
"com.ruoyi.common.utils.file"
,
"com.ruoyi.common.config"
};
}
\ No newline at end of file
public
static
final
String
TOKEN_HEADER
=
"Authorization"
;
//短信过期时间
public
static
final
int
EXPIRE_TIME
=
5
;
//秒
public
static
final
int
INTERVAL_TIME
=
4
*
60
;
//#短信时间间隔(每天限制次数) 单位 天
public
static
final
int
intervalTime
=
1
;
//短信每日发送次数
public
static
final
int
limitSms
=
5
;
}
src/main/java/com/lyy/admin/common/constant/RedisConstants.java
0 → 100644
View file @
9102f3c8
package
com
.
lyy
.
admin
.
common
.
constant
;
/**
* @Author:zhouxudong
* @version: 1.0
* @Date: 2023/12/1 11:55
* @Description: redis key
*/
public
class
RedisConstants
{
//------------------redis key--------------------------
public
static
final
String
token
=
"Token:"
;
//手机验证码 规则: 手机验证码:验证码类型:手机号
public
static
final
String
MSG_KEY
=
"liyeren:phone:message:"
;
//用户查看数据详情 使用额度 map存储: 格式: key phone + ":" + type value
public
static
final
String
LIMIT_NUM
=
"limit_num"
;
/**
* @description: 用于立业人发送短信 限制
* @date: 2023/12/11 18:35
* @param:
* @return:
**/
public
static
final
String
LIMIT_SMS
=
"liyeren_limit_sms:"
;
//---------------------end------------------------------
}
src/main/java/com/lyy/admin/common/encrypt/DecryptRequest.java
0 → 100644
View file @
9102f3c8
package
com
.
lyy
.
admin
.
common
.
encrypt
;
import
cn.hutool.core.codec.Base64
;
import
cn.hutool.crypto.SecureUtil
;
import
cn.hutool.crypto.symmetric.AES
;
import
cn.hutool.json.JSONUtil
;
import
com.lyy.admin.common.anno.Decrypt
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.core.MethodParameter
;
import
org.springframework.http.HttpHeaders
;
import
org.springframework.http.HttpInputMessage
;
import
org.springframework.http.converter.HttpMessageConverter
;
import
org.springframework.web.bind.annotation.ControllerAdvice
;
import
org.springframework.web.servlet.mvc.method.annotation.RequestBodyAdviceAdapter
;
import
java.io.ByteArrayInputStream
;
import
java.io.IOException
;
import
java.io.InputStream
;
import
java.lang.reflect.Type
;
import
java.nio.charset.StandardCharsets
;
import
java.util.Map
;
/**
* @Author:zhouxudong
*
* @version: 1.0 @Date: 2023/12/12 9:49 @Description:
*/
// @ControllerAdvice是一个全局数据处理组件
@ControllerAdvice
public
class
DecryptRequest
extends
RequestBodyAdviceAdapter
{
@Value
(
"${liyeren.key}"
)
private
String
decryptKey
;
/**
* @description: 配置支持条件,只有方法或者参数有Decrypt注解的时候才生效
* @date: 2023/12/12 9:50
* @param: [methodParameter, targetType, converterType]
* @return: boolean
*/
@Override
public
boolean
supports
(
MethodParameter
methodParameter
,
Type
targetType
,
Class
<?
extends
HttpMessageConverter
<?>>
converterType
)
{
return
methodParameter
.
hasMethodAnnotation
(
Decrypt
.
class
)
||
methodParameter
.
hasParameterAnnotation
(
Decrypt
.
class
);
}
/** 使用aop,在读取请求参数的之前,对请求参数进行解密 */
@Override
public
HttpInputMessage
beforeBodyRead
(
HttpInputMessage
inputMessage
,
MethodParameter
parameter
,
Type
targetType
,
Class
<?
extends
HttpMessageConverter
<?>>
converterType
)
throws
IOException
{
// 获取密钥的字节
byte
[]
key
=
decryptKey
.
getBytes
();
// 读取请求参数成为字节body
byte
[]
body
=
new
byte
[
inputMessage
.
getBody
().
available
()];
inputMessage
.
getBody
().
read
(
body
);
String
param
=
new
String
(
body
,
StandardCharsets
.
UTF_8
);
Map
map
=
JSONUtil
.
toBean
(
JSONUtil
.
toJsonStr
(
param
),
Map
.
class
);
System
.
out
.
println
(
"body = "
+
new
String
(
body
,
StandardCharsets
.
UTF_8
));
try
{
// 解密
AES
aes
=
SecureUtil
.
aes
(
key
);
// byte[] decrypt = aes.decrypt(body);
byte
[]
decrypt
=
aes
.
decrypt
(
Base64
.
decode
(
map
.
get
(
"data"
).
toString
().
getBytes
()));
// 将解密的字节放入字节数组输入流中
ByteArrayInputStream
bais
=
new
ByteArrayInputStream
(
decrypt
);
// 返回HttpInputMessage
return
new
HttpInputMessage
()
{
@Override
public
InputStream
getBody
()
{
return
bais
;
}
@Override
public
HttpHeaders
getHeaders
()
{
return
inputMessage
.
getHeaders
();
}
};
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
// 如果不需要进行处理的话,则直接调用父类的beforeBodyRead,相当于直接返回inputMessage,不做处理
return
super
.
beforeBodyRead
(
inputMessage
,
parameter
,
targetType
,
converterType
);
}
}
src/main/java/com/lyy/admin/common/encrypt/EncrptResponse.java
0 → 100644
View file @
9102f3c8
package
com
.
lyy
.
admin
.
common
.
encrypt
;
import
cn.hutool.crypto.SecureUtil
;
import
cn.hutool.crypto.symmetric.AES
;
import
cn.hutool.json.JSONUtil
;
import
com.fasterxml.jackson.core.JsonProcessingException
;
import
com.fasterxml.jackson.databind.ObjectMapper
;
import
com.lyy.admin.common.anno.Encrypt
;
import
com.lyy.admin.common.exception.LiyerenException
;
import
com.lyy.admin.common.utils.AjaxResult
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.boot.context.properties.EnableConfigurationProperties
;
import
org.springframework.core.MethodParameter
;
import
org.springframework.http.MediaType
;
import
org.springframework.http.converter.HttpMessageConverter
;
import
org.springframework.http.server.ServerHttpRequest
;
import
org.springframework.http.server.ServerHttpResponse
;
import
org.springframework.web.bind.annotation.ControllerAdvice
;
import
org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice
;
/**
* @Author:zhouxudong
*
* @version: 1.0 @Date: 2023/12/12 10:07 @Description:
*/
@ControllerAdvice
@Slf4j
public
class
EncrptResponse
implements
ResponseBodyAdvice
<
Object
>
{
@Value
(
"${liyeren.key}"
)
private
String
decryptKey
;
/** 支持什么时候加密 */
@Override
public
boolean
supports
(
MethodParameter
methodParameter
,
Class
<?
extends
HttpMessageConverter
<?>>
aClass
)
{
return
methodParameter
.
hasMethodAnnotation
(
Encrypt
.
class
);
}
/** 数据响应进行加密 */
@Override
public
Object
beforeBodyWrite
(
Object
result
,
MethodParameter
methodParameter
,
MediaType
mediaType
,
Class
<?
extends
HttpMessageConverter
<?>>
aClass
,
ServerHttpRequest
serverHttpRequest
,
ServerHttpResponse
serverHttpResponse
)
{
AjaxResult
value
=
AjaxResult
.
success
(
result
);
log
.
info
(
"result:{}"
,
value
);
boolean
isStringResult
=
methodParameter
.
getParameterType
().
equals
(
String
.
class
);
// 获取key的字节
AES
aes
=
SecureUtil
.
aes
(
decryptKey
.
getBytes
());
String
info
;
try
{
if
(
isStringResult
)
{
ObjectMapper
objectMapper
=
new
ObjectMapper
();
info
=
objectMapper
.
writeValueAsString
(
value
);
return
aes
.
encryptBase64
(
info
);
}
// 如果msg和data存在的话,则进行加密,最后进行返回
return
aes
.
encryptBase64
(
JSONUtil
.
toJsonStr
(
value
));
}
catch
(
Exception
e
)
{
throw
new
LiyerenException
(
"发生未知异常"
);
}
}
}
src/main/java/com/lyy/admin/common/exception/LiyerenException.java
0 → 100644
View file @
9102f3c8
package
com
.
lyy
.
admin
.
common
.
exception
;
import
lombok.Data
;
@Data
public
class
LiyerenException
extends
RuntimeException
{
private
int
code
;
private
String
message
;
public
int
getCode
()
{
return
code
;
}
public
String
getMessage
()
{
return
message
;
}
public
LiyerenException
(
int
code
,
String
message
)
{
this
.
code
=
code
;
this
.
message
=
message
;
}
public
LiyerenException
(
String
msg
)
{
this
.
code
=
500
;
this
.
message
=
msg
;
}
public
LiyerenException
(
APIExceptionEnum
apiExceptionEnum
)
{
this
.
code
=
apiExceptionEnum
.
getCode
();
this
.
message
=
apiExceptionEnum
.
getMessage
();
}
}
src/main/java/com/lyy/admin/common/interceptor/LoginInterceptor.java
View file @
9102f3c8
...
...
@@ -5,11 +5,16 @@ import cn.hutool.core.date.DateUtil;
import
com.baomidou.mybatisplus.core.conditions.query.QueryWrapper
;
import
com.lyy.admin.common.exception.APIException
;
import
com.lyy.admin.common.exception.APIExceptionEnum
;
import
com.lyy.admin.common.exception.LiyerenException
;
import
com.lyy.admin.common.utils.IpUtils
;
import
com.lyy.admin.common.utils.StringUtils
;
import
com.lyy.admin.domain.SysUserToken
;
import
com.lyy.admin.mapper.SysUserInfoMapper
;
import
com.lyy.admin.mapper.SysUserTokenMapper
;
import
com.lyy.admin.mapper.system.SysMembershipInfoMapper
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.stereotype.Component
;
import
org.springframework.web.servlet.HandlerInterceptor
;
...
...
@@ -18,6 +23,7 @@ import javax.servlet.http.HttpServletResponse;
import
java.util.Date
;
@Component
@Slf4j
public
class
LoginInterceptor
implements
HandlerInterceptor
{
@Autowired
...
...
@@ -25,11 +31,24 @@ public class LoginInterceptor implements HandlerInterceptor {
@Autowired
SysMembershipInfoMapper
sysMembershipInfoMapper
;
@Value
(
"${liyeren.whiteIp}"
)
private
String
whiteIp
;
@Override
public
boolean
preHandle
(
HttpServletRequest
request
,
HttpServletResponse
response
,
Object
handler
)
throws
Exception
{
//白名单判断
String
requestURI
=
request
.
getRequestURI
();
log
.
info
(
"请求地址:{}"
,
requestURI
);
if
(
requestURI
.
contains
(
"/api/liyeren"
)){
//立业人请求接口
//查询白名单
String
ip
=
IpUtils
.
getIpAddr
(
request
);
if
(
StringUtils
.
isEmpty
(
ip
)||!
whiteIp
.
contains
(
ip
)){
throw
new
LiyerenException
(
"没有请求权限"
);
}
return
true
;
}
String
token
=
request
.
getHeader
(
"token"
);
// 从 http 请求头中取出 token
if
(
token
==
null
||
""
.
equals
(
token
)
){
System
.
out
.
println
(
"@@@@@@@@@@@@@@@@@@@@@@@@@@"
+
token
);
...
...
@@ -51,5 +70,4 @@ public class LoginInterceptor implements HandlerInterceptor {
return
true
;
}
}
src/main/java/com/lyy/admin/common/redis/RedisConfig.java
0 → 100644
View file @
9102f3c8
package
com
.
lyy
.
admin
.
common
.
redis
;
import
com.fasterxml.jackson.annotation.JsonAutoDetect
;
import
com.fasterxml.jackson.annotation.JsonTypeInfo
;
import
com.fasterxml.jackson.annotation.PropertyAccessor
;
import
com.fasterxml.jackson.databind.ObjectMapper
;
import
com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator
;
import
org.springframework.context.annotation.Bean
;
import
org.springframework.context.annotation.Configuration
;
import
org.springframework.data.redis.connection.RedisConnectionFactory
;
import
org.springframework.data.redis.core.RedisTemplate
;
import
org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer
;
import
org.springframework.data.redis.serializer.StringRedisSerializer
;
/**
* redis配置
*
* @author garden
*/
@Configuration
public
class
RedisConfig
{
@Bean
@SuppressWarnings
(
value
=
{
"unchecked"
,
"rawtypes"
})
public
RedisTemplate
<
Object
,
Object
>
redisTemplate
(
RedisConnectionFactory
connectionFactory
)
{
RedisTemplate
<
Object
,
Object
>
template
=
new
RedisTemplate
<>();
template
.
setConnectionFactory
(
connectionFactory
);
StringRedisSerializer
stringRedisSerializer
=
new
StringRedisSerializer
();
template
.
setKeySerializer
(
stringRedisSerializer
);
// key的序列化类型
Jackson2JsonRedisSerializer
jackson2JsonRedisSerializer
=
new
Jackson2JsonRedisSerializer
(
Object
.
class
);
ObjectMapper
objectMapper
=
new
ObjectMapper
();
objectMapper
.
setVisibility
(
PropertyAccessor
.
ALL
,
JsonAutoDetect
.
Visibility
.
ANY
);
objectMapper
.
activateDefaultTyping
(
LaissezFaireSubTypeValidator
.
instance
,
ObjectMapper
.
DefaultTyping
.
NON_FINAL
,
JsonTypeInfo
.
As
.
PROPERTY
);
jackson2JsonRedisSerializer
.
setObjectMapper
(
objectMapper
);
jackson2JsonRedisSerializer
.
setObjectMapper
(
objectMapper
);
template
.
setValueSerializer
(
jackson2JsonRedisSerializer
);
// value的序列化类型
template
.
setHashKeySerializer
(
stringRedisSerializer
);
template
.
setHashValueSerializer
(
jackson2JsonRedisSerializer
);
template
.
afterPropertiesSet
();
return
template
;
}
}
src/main/java/com/lyy/admin/common/utils/AjaxResult.java
View file @
9102f3c8
package
com
.
lyy
.
admin
.
common
.
utils
;
import
org.apache.commons.lang3.ObjectUtils
;
import
java.util.HashMap
;
import
java.util.Objects
;
...
...
@@ -179,9 +181,9 @@ public class AjaxResult extends HashMap<String, Object>
}
public
static
AjaxResult
error
(
int
code
,
String
msg
)
public
static
AjaxResult
error
(
Integer
code
,
String
msg
)
{
return
new
AjaxResult
(
ErrorCodeEum
.
ERROR
.
code
()
,
msg
,
null
);
return
new
AjaxResult
(
ObjectUtils
.
isEmpty
(
code
)
?
ErrorCodeEum
.
ERROR
.
code
():
code
,
msg
,
null
);
}
/**
* 返回错误消息
...
...
src/main/java/com/lyy/admin/common/utils/BusinessService.java
0 → 100644
View file @
9102f3c8
package
com
.
lyy
.
admin
.
common
.
utils
;
import
cn.hutool.json.JSONUtil
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.stereotype.Component
;
import
org.springframework.web.reactive.function.client.WebClient
;
import
java.util.Map
;
/**
* @Author:zhouxudong
*
* @version: 1.0 @Date: 2023/11/24 17:13 @Description:
*/
@Component
@Slf4j
public
class
BusinessService
{
@Autowired
private
WebClient
webClient
;
@Value
(
"${business.url.thread}"
)
private
String
url
;
public
AjaxResult
savThread
(
Map
<
String
,
Object
>
params
)
{
AjaxResult
block
=
this
.
webClient
.
post
()
.
uri
(
url
)
.
bodyValue
(
params
)
.
retrieve
()
.
bodyToMono
(
AjaxResult
.
class
)
.
block
();
log
.
info
(
"注册保存线索信息:参数:{},结果:{}"
,
params
,
JSONUtil
.
toJsonStr
(
block
));
return
block
;
}
}
src/main/java/com/lyy/admin/common/utils/GlobalExceptionHandler.java
View file @
9102f3c8
package
com
.
lyy
.
admin
.
common
.
utils
;
import
cn.hutool.core.bean.BeanUtil
;
import
cn.hutool.crypto.SecureUtil
;
import
cn.hutool.crypto.symmetric.AES
;
import
cn.hutool.json.JSONUtil
;
import
com.fasterxml.jackson.core.JsonProcessingException
;
import
com.fasterxml.jackson.databind.ObjectMapper
;
import
com.lyy.admin.common.anno.Encrypt
;
import
com.lyy.admin.common.exception.APIException
;
import
com.lyy.admin.common.exception.LiyerenException
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.core.MethodParameter
;
import
org.springframework.http.MediaType
;
import
org.springframework.http.server.ServerHttpRequest
;
...
...
@@ -26,13 +33,15 @@ import javax.servlet.http.HttpServletRequest;
*/
@RestControllerAdvice
(
basePackages
=
"com.lyy.admin.controller"
)
public
class
GlobalExceptionHandler
implements
ResponseBodyAdvice
{
@Value
(
"${liyeren.key}"
)
private
String
decryptKey
;
private
static
final
Logger
log
=
LoggerFactory
.
getLogger
(
GlobalExceptionHandler
.
class
);
@Override
public
boolean
supports
(
MethodParameter
returnType
,
Class
converterType
)
{
boolean
assignableFrom
=
returnType
.
getParameterType
().
isAssignableFrom
(
AjaxResult
.
class
);
return
!
assignableFrom
;
boolean
Encrypt
=
returnType
.
hasMethodAnnotation
(
Encrypt
.
class
);
return
!
assignableFrom
&&!
Encrypt
;
}
@Override
...
...
@@ -64,6 +73,23 @@ public class GlobalExceptionHandler implements ResponseBodyAdvice {
return
fail
;
}
/*@ExceptionHandler(LiyerenException.class)
public Object APIExceptionHandler(LiyerenException apiException) {
int code = apiException.getCode();
String message = apiException.getMessage();
AjaxResult fail = AjaxResult.error( code,message);
AES aes = SecureUtil.aes(decryptKey.getBytes());
return aes.encryptBase64(JSONUtil.toJsonStr(fail));
}*/
@ExceptionHandler
(
LiyerenException
.
class
)
public
AjaxResult
APIExceptionHandler
(
LiyerenException
apiException
)
{
int
code
=
apiException
.
getCode
();
String
message
=
apiException
.
getMessage
();
AjaxResult
fail
=
AjaxResult
.
error
(
code
,
message
);
return
fail
;
}
/**
* 请求方式不支持
*/
...
...
src/main/java/com/lyy/admin/common/utils/IpUtils.java
0 → 100644
View file @
9102f3c8
package
com
.
lyy
.
admin
.
common
.
utils
;
import
javax.servlet.http.HttpServletRequest
;
import
java.net.InetAddress
;
import
java.net.UnknownHostException
;
/**
* 获取IP方法
*
* @author ruoyi
*/
public
class
IpUtils
{
public
static
String
getIpAddr
(
HttpServletRequest
request
)
{
if
(
request
==
null
)
{
return
null
;
}
String
ip
=
null
;
// X-Forwarded-For:Squid 服务代理
String
ipAddresses
=
request
.
getHeader
(
"X-Forwarded-For"
);
if
(
ipAddresses
==
null
||
ipAddresses
.
length
()
==
0
||
"unknown"
.
equalsIgnoreCase
(
ipAddresses
))
{
// Proxy-Client-IP:apache 服务代理
ipAddresses
=
request
.
getHeader
(
"Proxy-Client-IP"
);
}
if
(
ipAddresses
==
null
||
ipAddresses
.
length
()
==
0
||
"unknown"
.
equalsIgnoreCase
(
ipAddresses
))
{
// WL-Proxy-Client-IP:weblogic 服务代理
ipAddresses
=
request
.
getHeader
(
"WL-Proxy-Client-IP"
);
}
if
(
ipAddresses
==
null
||
ipAddresses
.
length
()
==
0
||
"unknown"
.
equalsIgnoreCase
(
ipAddresses
))
{
// HTTP_CLIENT_IP:有些代理服务器
ipAddresses
=
request
.
getHeader
(
"HTTP_CLIENT_IP"
);
}
if
(
ipAddresses
==
null
||
ipAddresses
.
length
()
==
0
||
"unknown"
.
equalsIgnoreCase
(
ipAddresses
))
{
// X-Real-IP:nginx服务代理
ipAddresses
=
request
.
getHeader
(
"X-Real-IP"
);
}
// 有些网络通过多层代理,那么获取到的ip就会有多个,一般都是通过逗号(,)分割开来,并且第一个ip为客户端的真实IP
if
(
ipAddresses
!=
null
&&
ipAddresses
.
length
()
!=
0
)
{
ip
=
ipAddresses
.
split
(
","
)[
0
];
}
// 还是不能获取到,最后再通过request.getRemoteAddr();获取
if
(
ip
==
null
||
ip
.
length
()
==
0
||
"unknown"
.
equalsIgnoreCase
(
ipAddresses
))
{
ip
=
request
.
getRemoteAddr
();
}
return
ip
.
equals
(
"0:0:0:0:0:0:0:1"
)
?
"127.0.0.1"
:
ip
;
}
public
static
boolean
internalIp
(
String
ip
)
{
byte
[]
addr
=
textToNumericFormatV4
(
ip
);
return
internalIp
(
addr
)
||
"127.0.0.1"
.
equals
(
ip
);
}
private
static
boolean
internalIp
(
byte
[]
addr
)
{
if
(
StringUtils
.
isNull
(
addr
)
||
addr
.
length
<
2
)
{
return
true
;
}
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
;
}
}
/**
* 将IPv4地址转换成字节
*
* @param text IPv4地址
* @return byte 字节
*/
public
static
byte
[]
textToNumericFormatV4
(
String
text
)
{
if
(
text
.
length
()
==
0
)
{
return
null
;
}
byte
[]
bytes
=
new
byte
[
4
];
String
[]
elements
=
text
.
split
(
"\\."
,
-
1
);
try
{
long
l
;
int
i
;
switch
(
elements
.
length
)
{
case
1
:
l
=
Long
.
parseLong
(
elements
[
0
]);
if
((
l
<
0L
)
||
(
l
>
4294967295L
)){
return
null
;
}
bytes
[
0
]
=
(
byte
)
(
int
)
(
l
>>
24
&
0xFF
);
bytes
[
1
]
=
(
byte
)
(
int
)
((
l
&
0xFFFFFF
)
>>
16
&
0xFF
);
bytes
[
2
]
=
(
byte
)
(
int
)
((
l
&
0xFFFF
)
>>
8
&
0xFF
);
bytes
[
3
]
=
(
byte
)
(
int
)
(
l
&
0xFF
);
break
;
case
2
:
l
=
Integer
.
parseInt
(
elements
[
0
]);
if
((
l
<
0L
)
||
(
l
>
255L
))
{
return
null
;
}
bytes
[
0
]
=
(
byte
)
(
int
)
(
l
&
0xFF
);
l
=
Integer
.
parseInt
(
elements
[
1
]);
if
((
l
<
0L
)
||
(
l
>
16777215L
))
{
return
null
;
}
bytes
[
1
]
=
(
byte
)
(
int
)
(
l
>>
16
&
0xFF
);
bytes
[
2
]
=
(
byte
)
(
int
)
((
l
&
0xFFFF
)
>>
8
&
0xFF
);
bytes
[
3
]
=
(
byte
)
(
int
)
(
l
&
0xFF
);
break
;
case
3
:
for
(
i
=
0
;
i
<
2
;
++
i
)
{
l
=
Integer
.
parseInt
(
elements
[
i
]);
if
((
l
<
0L
)
||
(
l
>
255L
))
{
return
null
;
}
bytes
[
i
]
=
(
byte
)
(
int
)
(
l
&
0xFF
);
}
l
=
Integer
.
parseInt
(
elements
[
2
]);
if
((
l
<
0L
)
||
(
l
>
65535L
))
{
return
null
;
}
bytes
[
2
]
=
(
byte
)
(
int
)
(
l
>>
8
&
0xFF
);
bytes
[
3
]
=
(
byte
)
(
int
)
(
l
&
0xFF
);
break
;
case
4
:
for
(
i
=
0
;
i
<
4
;
++
i
)
{
l
=
Integer
.
parseInt
(
elements
[
i
]);
if
((
l
<
0L
)
||
(
l
>
255L
))
{
return
null
;
}
bytes
[
i
]
=
(
byte
)
(
int
)
(
l
&
0xFF
);
}
break
;
default
:
return
null
;
}
}
catch
(
NumberFormatException
e
)
{
return
null
;
}
return
bytes
;
}
public
static
String
getHostIp
()
{
try
{
return
InetAddress
.
getLocalHost
().
getHostAddress
();
}
catch
(
UnknownHostException
e
)
{
}
return
"127.0.0.1"
;
}
public
static
String
getHostName
()
{
try
{
return
InetAddress
.
getLocalHost
().
getHostName
();
}
catch
(
UnknownHostException
e
)
{
}
return
"未知"
;
}
}
src/main/java/com/lyy/admin/
service/sms/HuaweiMessage
.java
→
src/main/java/com/lyy/admin/
common/utils/SendMsgUtils
.java
View file @
9102f3c8
This diff is collapsed.
Click to expand it.
src/main/java/com/lyy/admin/common/utils/redis/RedisUtil.java
0 → 100644
View file @
9102f3c8
package
com
.
lyy
.
admin
.
common
.
utils
.
redis
;
import
cn.hutool.extra.spring.SpringUtil
;
import
org.springframework.data.redis.core.RedisTemplate
;
import
java.util.Collection
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.concurrent.TimeUnit
;
/**
* @Author:zhouxudong
*
* @version: 1.0 @Date: 2023/11/20 9:27 @Description: redis 工具类
*/
public
class
RedisUtil
{
private
RedisUtil
()
{}
@SuppressWarnings
(
"unchecked"
)
private
static
RedisTemplate
<
String
,
Object
>
redisTemplate
=
SpringUtil
.
getBean
(
"redisTemplate"
,
RedisTemplate
.
class
);
/**
* 设置有效时间 单位默认秒
*
* @param key Redis键
* @param timeout 超时时间
* @return true=设置成功;false=设置失败
*/
public
static
boolean
expire
(
final
String
key
,
final
long
timeout
)
{
return
expire
(
key
,
timeout
,
TimeUnit
.
SECONDS
);
}
/**
* 设置有效时间
*
* @param key Redis键
* @param timeout 超时时间
* @param unit 时间单位
* @return true=设置成功;false=设置失败
*/
public
static
boolean
expire
(
final
String
key
,
final
long
timeout
,
final
TimeUnit
unit
)
{
Boolean
ret
=
redisTemplate
.
expire
(
key
,
timeout
,
unit
);
return
ret
!=
null
&&
ret
;
}
/**
* 删除单个key
*
* @param key 键
* @return true=删除成功;false=删除失败
*/
public
static
boolean
del
(
final
String
key
)
{
Boolean
ret
=
redisTemplate
.
delete
(
key
);
return
ret
!=
null
&&
ret
;
}
/**
* 删除多个key
*
* @param keys 键集合
* @return 成功删除的个数
*/
public
static
long
del
(
final
Collection
<
String
>
keys
)
{
Long
ret
=
redisTemplate
.
delete
(
keys
);
return
ret
==
null
?
0
:
ret
;
}
/**
* 存入普通对象
*
* @param key Redis键
* @param value 值
*/
public
static
void
set
(
final
String
key
,
final
Object
value
)
{
redisTemplate
.
opsForValue
().
set
(
key
,
value
);
}
// 存储普通对象操作
/**
* 存入普通对象
*
* @param key 键
* @param value 值
* @param timeout 有效期,单位秒
*/
public
static
void
set
(
final
String
key
,
final
Object
value
,
final
long
timeout
)
{
redisTemplate
.
opsForValue
().
set
(
key
,
value
,
timeout
,
TimeUnit
.
SECONDS
);
}
public
static
void
set
(
final
String
key
,
final
Object
value
,
final
long
timeout
,
TimeUnit
timeUnit
)
{
redisTemplate
.
opsForValue
().
set
(
key
,
value
,
timeout
,
timeUnit
);
}
/**
* 获取普通对象
*
* @param key 键
* @return 对象
*/
public
static
Object
get
(
final
String
key
)
{
return
redisTemplate
.
opsForValue
().
get
(
key
);
}
/**
* @description: 获取key的剩余过期时间 如果key不存在 或者没有设置过期时间 返回 -1
* @date: 2023/11/23 9:53
* @param: [key]
* @return: java.lang.Long
**/
public
static
Long
getExpire
(
final
String
key
){
return
redisTemplate
.
getExpire
(
key
);
}
// 存储Hash操作
/**
* 往Hash中存入数据
*
* @param key Redis键
* @param filed Hash filed键
* @param value 值
*/
public
static
void
hPut
(
final
String
key
,
final
String
filed
,
final
Object
value
)
{
redisTemplate
.
opsForHash
().
put
(
key
,
filed
,
value
);
}
/**
* 往Hash中存入多个数据
*
* @param key Redis键
* @param filedMap Hash键值对
*/
public
static
void
hPutAll
(
final
String
key
,
final
Map
<
String
,
Object
>
filedMap
)
{
redisTemplate
.
opsForHash
().
putAll
(
key
,
filedMap
);
}
/**
* 获取Hash中的数据
*
* @param key Redis键
* @param filed Hash filed键
* @return Hash中的对象
*/
public
static
Object
hGet
(
final
String
key
,
final
String
filed
)
{
return
redisTemplate
.
opsForHash
().
get
(
key
,
filed
);
}
/**
* 获取多个Hash中的数据
*
* @param key Redis键
* @param fileds Hash filed键集合
* @return Hash对象集合
*/
public
static
List
<
Object
>
hMultiGet
(
final
String
key
,
final
Collection
<
Object
>
fileds
)
{
return
redisTemplate
.
opsForHash
().
multiGet
(
key
,
fileds
);
}
// 存储Set相关操作
/**
* 往Set中存入数据
*
* @param key Redis键
* @param values 值
* @return 存入的个数
*/
public
static
long
sSet
(
final
String
key
,
final
Object
...
values
)
{
Long
count
=
redisTemplate
.
opsForSet
().
add
(
key
,
values
);
return
count
==
null
?
0
:
count
;
}
/**
* 删除Set中的数据
*
* @param key Redis键
* @param values 值
* @return 移除的个数
*/
public
static
long
sDel
(
final
String
key
,
final
Object
...
values
)
{
Long
count
=
redisTemplate
.
opsForSet
().
remove
(
key
,
values
);
return
count
==
null
?
0
:
count
;
}
// 存储List相关操作
/**
* 往List左侧中存入数据
*
* @param key Redis键
* @param value 数据
* @return 存入的个数
*/
public
static
long
lPush
(
final
String
key
,
final
Object
value
)
{
Long
count
=
redisTemplate
.
opsForList
().
leftPush
(
key
,
value
);
return
count
==
null
?
0
:
count
;
}
/**
* 往List右侧中存入数据
*
* @param key Redis键
* @param value 数据
* @return 存入的个数
*/
public
static
long
rPush
(
final
String
key
,
final
Object
value
)
{
Long
count
=
redisTemplate
.
opsForList
().
rightPush
(
key
,
value
);
return
count
==
null
?
0
:
count
;
}
/**
* 往List中左侧存入多个数据
*
* @param key Redis键
* @param values 多个数据
* @return 存入的个数
*/
public
static
long
lPushAll
(
final
String
key
,
final
Collection
<
Object
>
values
)
{
Long
count
=
redisTemplate
.
opsForList
().
leftPushAll
(
key
,
values
);
return
count
==
null
?
0
:
count
;
}
/**
* 往List中左侧存入多个数据
*
* @param key Redis键
* @param values 多个数据
* @return 存入的个数
*/
public
static
long
lPushAll
(
final
String
key
,
final
Object
...
values
)
{
Long
count
=
redisTemplate
.
opsForList
().
leftPushAll
(
key
,
values
);
return
count
==
null
?
0
:
count
;
}
/**
* 往List中右侧存入多个数据
*
* @param key Redis键
* @param values 多个数据
* @return 存入的个数
*/
public
static
long
rPushAll
(
final
String
key
,
final
Collection
<
Object
>
values
)
{
Long
count
=
redisTemplate
.
opsForList
().
rightPushAll
(
key
,
values
);
return
count
==
null
?
0
:
count
;
}
/**
* 往List中右侧存入多个数据
*
* @param key Redis键
* @param values 多个数据
* @return 存入的个数
*/
public
static
long
rPushAll
(
final
String
key
,
final
Object
...
values
)
{
Long
count
=
redisTemplate
.
opsForList
().
rightPushAll
(
key
,
values
);
return
count
==
null
?
0
:
count
;
}
/**
* 从List中获取begin到end之间的元素
*
* @param key Redis键
* @param start 开始位置
* @param end 结束位置(start=0,end=-1表示获取全部元素)
* @return List对象
*/
public
static
List
<
Object
>
listGetRange
(
final
String
key
,
final
int
start
,
final
int
end
)
{
return
redisTemplate
.
opsForList
().
range
(
key
,
start
,
end
);
}
/**
* 从List左侧弹出数据
*
* @param key Redis键
* @return 对象
*/
public
static
Object
listGetL
(
final
String
key
)
{
return
redisTemplate
.
opsForList
().
leftPop
(
key
);
}
/**
* 从List右侧弹出数据
*
* @param key Redis键
* @return 对象
*/
public
static
Object
listGetR
(
final
String
key
)
{
return
redisTemplate
.
opsForList
().
rightPop
(
key
);
}
/**
* @description: 移除有序集合中给定的分数区间的所有成员
* @date: 2023/11/27 15:19
* @param: [key, start, end]
* @return: Long 移除的成员数
**/
public
static
Long
delZset
(
String
key
,
double
start
,
double
end
){
return
redisTemplate
.
opsForZSet
().
removeRangeByScore
(
key
,
start
,
end
);
}
/**
* @description: 计算在有序集合中指定区间分数的成员数
* @date: 2023/11/27 15:21
* @param: [key, start, end]
* @return: java.lang.Long
**/
public
static
Long
countZset
(
String
key
,
double
start
,
double
end
){
return
redisTemplate
.
opsForZSet
().
count
(
key
,
start
,
end
);
}
/**
* @description: 向有序集合添加一个或多个成员,或者更新已存在成员的分数
* @date: 2023/11/27 15:26
* @param: [key, fileds, end]
* @return: boolean
**/
public
static
boolean
addZset
(
String
key
,
Object
fileds
,
double
end
){
return
Boolean
.
TRUE
.
equals
(
redisTemplate
.
opsForZSet
().
add
(
key
,
fileds
,
end
));
}
}
src/main/java/com/lyy/admin/controller/WeixinController.java
View file @
9102f3c8
...
...
@@ -6,12 +6,18 @@ import cn.hutool.json.JSONObject;
import
cn.hutool.json.JSONUtil
;
import
com.baomidou.mybatisplus.core.conditions.query.QueryWrapper
;
import
com.lyy.admin.VO.SysUserInfoVO
;
import
com.lyy.admin.common.constant.Constants
;
import
com.lyy.admin.common.constant.RedisConstants
;
import
com.lyy.admin.common.exception.APIException
;
import
com.lyy.admin.common.exception.APIExceptionEnum
;
import
com.lyy.admin.common.utils.BusinessService
;
import
com.lyy.admin.common.utils.WeixinUtil
;
import
com.lyy.admin.common.utils.redis.RedisUtil
;
import
com.lyy.admin.common.utils.uuid.IdUtils
;
import
com.lyy.admin.domain.SysUserInfo
;
import
com.lyy.admin.domain.system.SysMembershipInfo
;
import
com.lyy.admin.enumerate.BusinessTypeEnum
;
import
com.lyy.admin.enumerate.ThreadSourceEnum
;
import
com.lyy.admin.service.SysUserInfoService
;
import
com.lyy.admin.service.system.SysMembershipInfoService
;
import
io.swagger.annotations.Api
;
...
...
@@ -22,6 +28,9 @@ import org.springframework.stereotype.Controller;
import
org.springframework.web.bind.annotation.*
;
import
java.util.Date
;
import
java.util.HashMap
;
import
java.util.Map
;
import
java.util.concurrent.CompletableFuture
;
@Controller
...
...
@@ -34,6 +43,9 @@ public class WeixinController extends BaseController {
@Autowired
SysMembershipInfoService
sysMembershipInfoService
;
@Autowired
private
BusinessService
businessService
;
@PostMapping
(
"/login"
)
@ResponseBody
@ApiOperation
(
value
=
"获取手机号码并登录"
,
notes
=
""
)
...
...
@@ -60,7 +72,24 @@ public class WeixinController extends BaseController {
sysUserInfo
.
setLoginName
(
phoneNumber
);
sysUserInfo
.
setCreateTime
(
DateUtil
.
date
());
sysUserInfo
.
setCreateBy
(
"9999"
);
sysUserInfo
.
setSource
(
1
);
sysUserInfo
.
setSource
(
ThreadSourceEnum
.
YQZD
.
getCode
());
// 给当前用户存储 解锁次数
RedisUtil
.
hPut
(
RedisConstants
.
LIMIT_NUM
,
phoneNumber
+
":"
+
BusinessTypeEnum
.
PARK
.
getCode
(),
BusinessTypeEnum
.
PARK
.
getNumber
());
RedisUtil
.
hPut
(
RedisConstants
.
LIMIT_NUM
,
phoneNumber
+
":"
+
BusinessTypeEnum
.
CARRIER
.
getCode
(),
BusinessTypeEnum
.
CARRIER
.
getNumber
());
// 保存一条线索信息
Map
<
String
,
Object
>
saveThread
=
new
HashMap
<>();
saveThread
.
put
(
"dataSource"
,
ThreadSourceEnum
.
YQZD
.
getCode
());
saveThread
.
put
(
"phone"
,
phoneNumber
);
saveThread
.
put
(
"createTime"
,
DateUtil
.
date
());
CompletableFuture
.
runAsync
(()
->
businessService
.
savThread
(
saveThread
));
sysUserInfoService
.
save
(
sysUserInfo
);
}
...
...
src/main/java/com/lyy/admin/controller/api/ApiController.java
0 → 100644
View file @
9102f3c8
package
com
.
lyy
.
admin
.
controller
.
api
;
import
cn.hutool.crypto.SecureUtil
;
import
cn.hutool.crypto.symmetric.AES
;
import
cn.hutool.crypto.symmetric.SymmetricAlgorithm
;
import
com.lyy.admin.VO.sms.SendPhoneVo
;
import
com.lyy.admin.common.anno.Decrypt
;
import
com.lyy.admin.common.anno.Encrypt
;
import
com.lyy.admin.service.liyerenapi.LiyerenService
;
import
io.swagger.annotations.Api
;
import
io.swagger.annotations.ApiOperation
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.validation.annotation.Validated
;
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
;
/**
* @Author:zhouxudong
* @version: 1.0
* @Date: 2023/12/11 18:00
* @Description: 提供给立业人 app 接口
*/
@RestController
@RequestMapping
(
"/api/liyeren"
)
@Api
(
tags
=
"立业人接口"
)
public
class
ApiController
{
@Autowired
LiyerenService
liyerenService
;
//@Encrypt 加在方法上 @Decrypt 加在参数上
@PostMapping
(
"/sendMsg"
)
@ApiOperation
(
value
=
"发送短信"
,
notes
=
"发送短信"
)
public
Boolean
sendMsg
(
@RequestBody
SendPhoneVo
sendPhoneVo
){
return
this
.
liyerenService
.
sendMsg
(
sendPhoneVo
);
}
}
src/main/java/com/lyy/admin/domain/smslog/SysSmsLogEntity.java
0 → 100644
View file @
9102f3c8
package
com
.
lyy
.
admin
.
domain
.
smslog
;
import
com.baomidou.mybatisplus.annotation.*
;
import
lombok.*
;
import
lombok.experimental.Accessors
;
import
java.time.LocalDateTime
;
/**
* 短信发送记录表;
*
* @author : http://www.chiner.pro
* @date : 2023-11-20
*/
@TableName
(
"sys_sms_log"
)
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@ToString
@Accessors
(
chain
=
true
)
public
class
SysSmsLogEntity
{
@TableId
(
type
=
IdType
.
ASSIGN_ID
)
protected
Long
id
;
/** 返回标识符 */
private
String
code
;
/** 返回字段描述 */
private
String
description
;
/** json格式字符串 */
private
String
result
;
/** 短信类型 */
private
String
type
;
private
String
phone
;
protected
String
createBy
;
protected
LocalDateTime
createTime
;
protected
String
updateBy
;
protected
LocalDateTime
updateTime
;
protected
Integer
version
;
}
src/main/java/com/lyy/admin/domain/system/SysCarouselInfo.java
View file @
9102f3c8
...
...
@@ -86,6 +86,12 @@ public class SysCarouselInfo implements Serializable {
@ApiModelProperty
(
hidden
=
true
)
private
String
linkUrl
;
@ApiModelProperty
(
hidden
=
true
)
private
Integer
urlType
;
@ApiModelProperty
(
hidden
=
true
)
private
String
videoCover
;
@TableField
(
exist
=
false
)
private
static
final
long
serialVersionUID
=
1L
;
}
\ No newline at end of file
src/main/java/com/lyy/admin/enumerate/BusinessTypeEnum.java
0 → 100644
View file @
9102f3c8
package
com
.
lyy
.
admin
.
enumerate
;
import
lombok.Getter
;
@Getter
public
enum
BusinessTypeEnum
{
DEVELOPMENT
(
1
,
"开发区"
,
0
),
PARK
(
2
,
"园区"
,
20
),
LAND
(
3
,
"土地"
,
0
),
CARRIER
(
4
,
"载体"
,
30
),;
private
final
Integer
code
;
private
final
String
name
;
//详情页面访问次数 默认次数 减去当前次数1
private
final
Integer
number
;
BusinessTypeEnum
(
Integer
typeId
,
String
name
,
Integer
number
)
{
this
.
code
=
typeId
;
this
.
name
=
name
;
this
.
number
=
number
;
}
public
static
Integer
getNum
(
Integer
code
){
for
(
BusinessTypeEnum
bt:
values
()){
if
(
bt
.
code
.
equals
(
code
)){
return
bt
.
number
;
}
}
return
null
;
}
}
src/main/java/com/lyy/admin/enumerate/SendMsgTypeEnum.java
0 → 100644
View file @
9102f3c8
package
com
.
lyy
.
admin
.
enumerate
;
import
lombok.Getter
;
/**
* @description: 立业人使用枚举
* @date: 2023/12/11 18:34
* @param:
* @return:
**/
@Getter
public
enum
SendMsgTypeEnum
{
REGISTER
(
1
,
"a0072fe0c74c47e59fbf700a4ce94350"
,
"立业人_注册"
),
LOGIN
(
2
,
"a0072fe0c74c47e59fbf700a4ce94350"
,
"立业人_登录"
),
FORGOT_PASSWORD
(
3
,
"a0072fe0c74c47e59fbf700a4ce94350"
,
"立业人_忘记密码"
),
UPDATE_PASSWORD
(
4
,
"a0072fe0c74c47e59fbf700a4ce94350"
,
"立业人_修改密码"
);
private
final
Integer
code
;
private
final
String
templateId
;
private
final
String
name
;
SendMsgTypeEnum
(
Integer
code
,
String
templateId
,
String
name
)
{
this
.
code
=
code
;
this
.
templateId
=
templateId
;
this
.
name
=
name
;
}
public
static
String
getTemplateId
(
Integer
code
)
{
for
(
SendMsgTypeEnum
bt
:
values
())
{
if
(
bt
.
code
.
equals
(
code
))
{
return
bt
.
templateId
;
}
}
return
null
;
}
public
static
String
getName
(
Integer
code
)
{
for
(
SendMsgTypeEnum
bt
:
values
())
{
if
(
bt
.
code
.
equals
(
code
))
{
return
bt
.
name
;
}
}
return
null
;
}
}
src/main/java/com/lyy/admin/enumerate/ThreadSourceEnum.java
0 → 100644
View file @
9102f3c8
package
com
.
lyy
.
admin
.
enumerate
;
public
enum
ThreadSourceEnum
{
YQZD
(
1
,
"园区字典"
),
LYY
(
2
,
"立业云"
);
private
Integer
code
;
private
String
name
;
ThreadSourceEnum
(
Integer
code
,
String
name
)
{
this
.
code
=
code
;
this
.
name
=
name
;
}
public
Integer
getCode
()
{
return
code
;
}
}
src/main/java/com/lyy/admin/enumerate/UrlTypeEnum.java
0 → 100644
View file @
9102f3c8
package
com
.
lyy
.
admin
.
enumerate
;
public
enum
UrlTypeEnum
{
PIC
(
1
,
"图片"
),
VIDEO
(
2
,
"视频"
),
OTHER
(
3
,
"其它"
);
private
Integer
code
;
private
String
name
;
UrlTypeEnum
(
Integer
code
,
String
name
)
{
this
.
code
=
code
;
this
.
name
=
name
;
}
public
Integer
getCode
()
{
return
code
;
}
public
String
getName
()
{
return
name
;
}
public
static
String
getName
(
Integer
code
)
{
for
(
UrlTypeEnum
bt
:
values
())
{
if
(
bt
.
code
.
equals
(
code
))
{
return
bt
.
name
;
}
}
return
null
;
}
}
src/main/java/com/lyy/admin/mapper/sms/SysSmsLogMapper.java
0 → 100644
View file @
9102f3c8
package
com
.
lyy
.
admin
.
mapper
.
sms
;
import
com.baomidou.mybatisplus.core.mapper.BaseMapper
;
import
com.lyy.admin.domain.smslog.SysSmsLogEntity
;
import
org.apache.ibatis.annotations.Mapper
;
/**
* @author: zhouxudong
* @version: 1.0
* @createTime: 2023/11/20 15:02
* @description: 短信发送记录表
*/
@Mapper
public
interface
SysSmsLogMapper
extends
BaseMapper
<
SysSmsLogEntity
>
{}
src/main/java/com/lyy/admin/service/developmentinfo/impl/DevelopmentInfoServiceImpl.java
View file @
9102f3c8
...
...
@@ -365,7 +365,8 @@ public class DevelopmentInfoServiceImpl extends ServiceImpl<DevelopmentInfoMappe
Integer
yuanquId
=
CarouselTypeEnum
.
KAIFAQU
.
getType
();
LambdaQueryWrapper
<
SysCarouselInfo
>
tWrapper
=
new
LambdaQueryWrapper
<>();
tWrapper
.
eq
(
SysCarouselInfo:
:
getType
,
yuanquId
).
eq
(
SysCarouselInfo:
:
getAssociationId
,
id
).
eq
(
SysCarouselInfo:
:
getStatus
,
StatusEnum
.
ENABLE
.
getCode
());
tWrapper
.
eq
(
SysCarouselInfo:
:
getType
,
yuanquId
).
eq
(
SysCarouselInfo:
:
getAssociationId
,
id
)
.
eq
(
SysCarouselInfo:
:
getUrlType
,
UrlTypeEnum
.
PIC
.
getCode
()).
eq
(
SysCarouselInfo:
:
getStatus
,
StatusEnum
.
ENABLE
.
getCode
());
List
<
SysCarouselInfo
>
sysCarouselInfos
=
sysCarouselInfoService
.
list
(
tWrapper
);
developmentInfoAllVO
.
setSysCarouselInfos
(
sysCarouselInfos
);
...
...
@@ -570,18 +571,19 @@ public class DevelopmentInfoServiceImpl extends ServiceImpl<DevelopmentInfoMappe
List
<
DevelopmentIndustrialLandInfo
>
list4
=
developmentIndustrialLandInfoService
.
list
(
diliQW
);
developmentInfoAllSaveVO
.
setIndustryLandInfos
(
list4
);
//开发区图片
QueryWrapper
<
SysCarouselInfo
>
sciQW
=
new
QueryWrapper
<>();
sciQW
.
eq
(
"association_id"
,
id
);
sciQW
.
eq
(
"type"
,
CarouselTypeEnum
.
KAIFAQU
.
getType
());
List
<
SysCarouselInfo
>
list5
=
sysCarouselInfoService
.
list
(
sciQW
);
List
<
String
>
collect
=
list5
.
stream
().
map
(
e
->
{
return
e
.
getImgUrl
();
}).
collect
(
Collectors
.
toList
());
// QueryWrapper<SysCarouselInfo> sciQW = new QueryWrapper<>();
// sciQW.eq("association_id", id);
// sciQW.eq("type", CarouselTypeEnum.KAIFAQU.getType());
// List<SysCarouselInfo> list5 = sysCarouselInfoService.list(sciQW);
// List<String> collect = list5.stream().map(e -> {
// return e.getImgUrl();
// }).collect(Collectors.toList());
List
<
String
>
imgUrls
=
sysCarouselInfoService
.
getImgUrls
(
CarouselTypeEnum
.
KAIFAQU
,
id
);
if
(
StringUtils
.
isNotBlank
(
developmentInfo
.
getImgUrl
())){
collect
.
add
(
developmentInfo
.
getImgUrl
());
collect
=
collect
.
stream
().
distinct
().
collect
(
Collectors
.
toList
());
imgUrls
.
add
(
developmentInfo
.
getImgUrl
());
imgUrls
=
imgUrls
.
stream
().
distinct
().
collect
(
Collectors
.
toList
());
}
developmentInfoAllSaveVO
.
setCarouselUrls
(
collect
);
developmentInfoAllSaveVO
.
setCarouselUrls
(
imgUrls
);
//政策文件
QueryWrapper
<
FileSource
>
fsQW
=
new
QueryWrapper
<>();
fsQW
.
eq
(
"object_id"
,
id
);
...
...
src/main/java/com/lyy/admin/service/impl/SysUserInfoServiceImpl.java
View file @
9102f3c8
...
...
@@ -6,10 +6,14 @@ import cn.hutool.core.util.IdUtil;
import
com.baomidou.mybatisplus.core.conditions.query.QueryWrapper
;
import
com.baomidou.mybatisplus.extension.service.impl.ServiceImpl
;
import
com.lyy.admin.common.config.LyyConfig
;
import
com.lyy.admin.common.constant.Constants
;
import
com.lyy.admin.common.exception.APIException
;
import
com.lyy.admin.common.exception.APIExceptionEnum
;
import
com.lyy.admin.common.utils.redis.RedisUtil
;
import
com.lyy.admin.domain.SysUserInfo
;
import
com.lyy.admin.domain.SysUserToken
;
import
com.lyy.admin.enumerate.BusinessTypeEnum
;
import
com.lyy.admin.enumerate.ThreadSourceEnum
;
import
com.lyy.admin.mapper.SysUserInfoMapper
;
import
com.lyy.admin.mapper.SysUserTokenMapper
;
import
com.lyy.admin.service.SysUserInfoService
;
...
...
@@ -17,6 +21,10 @@ import org.springframework.beans.factory.annotation.Autowired;
import
org.springframework.stereotype.Service
;
import
org.springframework.util.DigestUtils
;
import
java.util.HashMap
;
import
java.util.Map
;
import
java.util.concurrent.CompletableFuture
;
/**
* @author yaobaizheng
* @description 针对表【sys_user_info(用户信息表)】的数据库操作Service实现
...
...
src/main/java/com/lyy/admin/service/liyerenapi/LiyerenService.java
0 → 100644
View file @
9102f3c8
package
com
.
lyy
.
admin
.
service
.
liyerenapi
;
import
com.lyy.admin.VO.sms.SendPhoneVo
;
/**
* @Author:zhouxudong
* @version: 1.0
* @Date: 2023/12/11 18:12
* @Description:
*/
public
interface
LiyerenService
{
/**
* @description: 发送短信
* @date: 2023/12/11 18:13
* @param: [sendPhoneVo]
* @return: java.lang.String
**/
Boolean
sendMsg
(
SendPhoneVo
sendPhoneVo
);
}
src/main/java/com/lyy/admin/service/liyerenapi/impl/LiyerenServiceImpl.java
0 → 100644
View file @
9102f3c8
package
com
.
lyy
.
admin
.
service
.
liyerenapi
.
impl
;
import
cn.hutool.core.date.DateTime
;
import
cn.hutool.core.date.DateUtil
;
import
cn.hutool.core.util.ReUtil
;
import
cn.hutool.json.JSONUtil
;
import
com.lyy.admin.VO.sms.SendPhoneVo
;
import
com.lyy.admin.VO.sms.SmsVo
;
import
com.lyy.admin.common.constant.Constants
;
import
com.lyy.admin.common.constant.RedisConstants
;
import
com.lyy.admin.common.exception.LiyerenException
;
import
com.lyy.admin.common.utils.redis.RedisUtil
;
import
com.lyy.admin.domain.smslog.SysSmsLogEntity
;
import
com.lyy.admin.enumerate.SendMsgTypeEnum
;
import
com.lyy.admin.service.liyerenapi.LiyerenService
;
import
com.lyy.admin.common.utils.SendMsgUtils
;
import
com.lyy.admin.service.sms.SysSmsLogService
;
import
lombok.extern.slf4j.Slf4j
;
import
org.apache.commons.lang3.StringUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
org.springframework.util.ObjectUtils
;
import
java.util.ArrayList
;
import
java.util.List
;
import
java.util.concurrent.TimeUnit
;
/**
* @Author:zhouxudong
*
* @version: 1.0 @Date: 2023/12/11 18:12 @Description:
*/
@Service
@Slf4j
public
class
LiyerenServiceImpl
implements
LiyerenService
{
@Autowired
private
SendMsgUtils
sendMsgUtils
;
@Autowired
private
SysSmsLogService
sysSmsLogService
;
/**
* @description: 手机号每日发送次数
* @date: 2023/11/27 15:32
* @param: [phone]
* @return: void
*/
private
void
limitSms
(
String
phone
)
{
String
key
=
RedisConstants
.
LIMIT_SMS
+
phone
;
DateTime
now
=
DateUtil
.
date
();
DateTime
startTime
=
DateUtil
.
offsetDay
(
now
,
Constants
.
intervalTime
*
-
1
);
RedisUtil
.
delZset
(
key
,
0
,
startTime
.
getTime
());
Long
count
=
RedisUtil
.
countZset
(
key
,
startTime
.
getTime
(),
now
.
getTime
());
if
(
count
==
null
||
count
<=
Constants
.
limitSms
)
{
RedisUtil
.
addZset
(
key
,
now
.
getTime
(),
now
.
getTime
());
}
else
{
throw
new
LiyerenException
(
"短信发送频繁,每日短信发送次数为"
+
Constants
.
limitSms
);
}
}
private
void
check
(
SendPhoneVo
sendPhoneVo
)
{
if
(
StringUtils
.
isEmpty
(
sendPhoneVo
.
getPhone
()))
{
throw
new
LiyerenException
(
"手机号不能为空"
);
}
boolean
match
=
ReUtil
.
isMatch
(
"^1[3-9]\\d{9}$"
,
sendPhoneVo
.
getPhone
());
if
(!
match
)
{
throw
new
LiyerenException
(
"手机号码格式有误"
);
}
if
(
ObjectUtils
.
isEmpty
(
sendPhoneVo
.
getCode
())
||
ObjectUtils
.
isEmpty
(
sendPhoneVo
.
getType
()))
{
throw
new
LiyerenException
(
"缺少参数"
);
}
}
/**
* @description: 发送短信
* @date: 2023/12/11 18:13
* @param: [sendPhoneVo]
* @return: java.lang.String
*/
@Override
public
Boolean
sendMsg
(
SendPhoneVo
sendPhoneVo
)
{
check
(
sendPhoneVo
);
if
(
StringUtils
.
isEmpty
(
SendMsgTypeEnum
.
getTemplateId
(
sendPhoneVo
.
getType
())))
{
throw
new
LiyerenException
(
"参数有误"
);
}
limitSms
(
sendPhoneVo
.
getPhone
());
String
key
=
RedisConstants
.
MSG_KEY
+
sendPhoneVo
.
getType
()
+
":"
+
sendPhoneVo
.
getPhone
();
//
Long
expire
=
RedisUtil
.
getExpire
(
key
);
// 间隔 1分钟内
if
(
expire
!=
null
&&
expire
>
Constants
.
INTERVAL_TIME
)
{
throw
new
LiyerenException
(
"短信已发送,请稍后重试"
);
}
List
<
Integer
>
temp
=
new
ArrayList
<>();
temp
.
add
(
sendPhoneVo
.
getCode
());
// 发送短信
String
result
=
sendMsgUtils
.
sendMsg
(
sendPhoneVo
.
getPhone
(),
SendMsgTypeEnum
.
getTemplateId
(
sendPhoneVo
.
getType
()),
temp
.
toString
());
SmsVo
smsVo
=
JSONUtil
.
toBean
(
result
,
SmsVo
.
class
);
if
(
ObjectUtils
.
isEmpty
(
smsVo
))
{
throw
new
LiyerenException
(
"短信发送失败"
);
}
log
.
info
(
"发送短信信息:{},返回结果:{}"
,
sendPhoneVo
.
getCode
(),
result
);
SysSmsLogEntity
sysSmsLog
=
new
SysSmsLogEntity
();
sysSmsLog
.
setCode
(
smsVo
.
getCode
())
.
setDescription
(
smsVo
.
getDescription
())
.
setType
(
SendMsgTypeEnum
.
getName
(
sendPhoneVo
.
getType
()))
.
setResult
(
result
)
.
setPhone
(
sendPhoneVo
.
getPhone
());
this
.
sysSmsLogService
.
save
(
sysSmsLog
);
if
(!
"000000"
.
equals
(
smsVo
.
getCode
()))
{
log
.
error
(
"短信发送失败:{},手机号:{}"
,
smsVo
,
sendPhoneVo
.
getPhone
());
throw
new
LiyerenException
(
407
,
result
);
}
RedisUtil
.
set
(
key
,
String
.
valueOf
(
sendPhoneVo
.
getCode
()),
Constants
.
EXPIRE_TIME
,
TimeUnit
.
MINUTES
);
return
true
;
}
}
src/main/java/com/lyy/admin/service/parkinfo/impl/ParkInfoServiceImpl.java
View file @
9102f3c8
package
com
.
lyy
.
admin
.
service
.
parkinfo
.
impl
;
import
cn.hutool.core.convert.Convert
;
import
cn.hutool.core.date.DateUtil
;
import
cn.hutool.core.util.NumberUtil
;
import
cn.hutool.json.JSONArray
;
...
...
@@ -62,9 +63,6 @@ public class ParkInfoServiceImpl extends ServiceImpl<ParkInfoMapper, ParkInfo> i
@Autowired
ParkCarrierInfoMapper
parkCarrierInfoMapper
;
@Autowired
CarrierInfoMapper
carrierInfoMapper
;
@Autowired
SysMembershipInfoMapper
sysMembershipInfoMapper
;
...
...
@@ -325,7 +323,13 @@ public class ParkInfoServiceImpl extends ServiceImpl<ParkInfoMapper, ParkInfo> i
parkInfoAllVO
.
setParkTrafficInfoVOs
(
parkTrafficInfosJsonArray
);
// parkInfoAllVO.setParkTrafficInfo(parkTrafficInfos);
//获取载体信息
List
<
CarrierInfoListVO
>
carrierInfoVOS
=
carrierInfoMapper
.
selectCarrierInfoVOList
(
id
);
LambdaQueryWrapper
<
CarrierInfo
>
CIQuery
=
new
LambdaQueryWrapper
<>();
CIQuery
.
eq
(
CarrierInfo:
:
getParkId
,
id
);
List
<
CarrierInfo
>
list
=
carrierInfoService
.
list
(
CIQuery
);
List
<
CarrierInfo
>
collect
=
list
.
stream
().
collect
(
Collectors
.
collectingAndThen
(
Collectors
.
toCollection
(()
->
new
TreeSet
<>(
Comparator
.
comparing
(
CarrierInfo:
:
getType
))),
ArrayList:
:
new
));
List
<
CarrierInfoTypeListVO
>
carrierInfoVOS
=
Convert
.
toList
(
CarrierInfoTypeListVO
.
class
,
collect
);
parkInfoAllVO
.
setCarrierInfoVO
(
carrierInfoVOS
);
//获取污水处理能力信息
QueryWrapper
<
ParkSewageInfo
>
PSIWrapper
=
new
QueryWrapper
<>();
...
...
@@ -377,7 +381,8 @@ public class ParkInfoServiceImpl extends ServiceImpl<ParkInfoMapper, ParkInfo> i
Integer
yuanquId
=
CarouselTypeEnum
.
YUANQU
.
getType
();
LambdaQueryWrapper
<
SysCarouselInfo
>
tWrapper
=
new
LambdaQueryWrapper
<>();
tWrapper
.
eq
(
SysCarouselInfo:
:
getType
,
yuanquId
).
eq
(
SysCarouselInfo:
:
getAssociationId
,
id
).
eq
(
SysCarouselInfo:
:
getStatus
,
StatusEnum
.
ENABLE
.
getCode
());
tWrapper
.
eq
(
SysCarouselInfo:
:
getType
,
yuanquId
).
eq
(
SysCarouselInfo:
:
getAssociationId
,
id
)
.
eq
(
SysCarouselInfo:
:
getUrlType
,
UrlTypeEnum
.
PIC
.
getCode
()).
eq
(
SysCarouselInfo:
:
getStatus
,
StatusEnum
.
ENABLE
.
getCode
());
List
<
SysCarouselInfo
>
sysCarouselInfos
=
sysCarouselInfoService
.
list
(
tWrapper
);
parkInfoAllVO
.
setSysCarouselInfos
(
sysCarouselInfos
);
return
parkInfoAllVO
;
...
...
@@ -612,18 +617,19 @@ public class ParkInfoServiceImpl extends ServiceImpl<ParkInfoMapper, ParkInfo> i
}
//产业园图片
QueryWrapper
<
SysCarouselInfo
>
sciQW
=
new
QueryWrapper
<>();
sciQW
.
eq
(
"association_id"
,
id
);
sciQW
.
eq
(
"type"
,
CarouselTypeEnum
.
YUANQU
.
getType
());
List
<
SysCarouselInfo
>
list4
=
sysCarouselInfoService
.
list
(
sciQW
);
List
<
String
>
collect
=
list4
.
stream
().
map
(
e
->
{
return
e
.
getImgUrl
();
}).
collect
(
Collectors
.
toList
());
// QueryWrapper<SysCarouselInfo> sciQW = new QueryWrapper<>();
// sciQW.eq("association_id", id);
// sciQW.eq("type", CarouselTypeEnum.YUANQU.getType());
// List<SysCarouselInfo> list4 = sysCarouselInfoService.list(sciQW);
// List<String> collect = list4.stream().map(e -> {
// return e.getImgUrl();
// }).collect(Collectors.toList());
List
<
String
>
imgUrls
=
sysCarouselInfoService
.
getImgUrls
(
CarouselTypeEnum
.
YUANQU
,
id
);
if
(
StringUtils
.
isNotBlank
(
parkInfo
.
getImgUrl
())){
collect
.
add
(
parkInfo
.
getImgUrl
());
collect
=
collect
.
stream
().
distinct
().
collect
(
Collectors
.
toList
());
imgUrls
.
add
(
parkInfo
.
getImgUrl
());
imgUrls
=
imgUrls
.
stream
().
distinct
().
collect
(
Collectors
.
toList
());
}
parkInfoAllSaveVO
.
setCarouselUrls
(
collect
);
parkInfoAllSaveVO
.
setCarouselUrls
(
imgUrls
);
//政策文件上传
QueryWrapper
<
FileSource
>
fsQW
=
new
QueryWrapper
<>();
...
...
src/main/java/com/lyy/admin/service/sms/IMessage.java
deleted
100644 → 0
View file @
3024efaf
package
com
.
lyy
.
admin
.
service
.
sms
;
import
java.util.List
;
public
interface
IMessage
{
boolean
sendMsg
(
String
messageContent
,
String
phone
);
boolean
sendMsgBatch
(
String
messageContent
,
List
<
String
>
phone
);
}
src/main/java/com/lyy/admin/service/sms/SysSmsLogService.java
0 → 100644
View file @
9102f3c8
package
com
.
lyy
.
admin
.
service
.
sms
;
import
com.baomidou.mybatisplus.extension.service.IService
;
import
com.lyy.admin.domain.smslog.SysSmsLogEntity
;
/**
* @author: zhouxudong
* @version: 1.0
* @createTime: 2023/11/20 15:01
* @description: 短信发送记录表
*/
public
interface
SysSmsLogService
extends
IService
<
SysSmsLogEntity
>
{
}
src/main/java/com/lyy/admin/service/sms/impl/SysSmsLogServiceImpl.java
0 → 100644
View file @
9102f3c8
package
com
.
lyy
.
admin
.
service
.
sms
.
impl
;
import
com.baomidou.mybatisplus.extension.service.impl.ServiceImpl
;
import
com.lyy.admin.domain.smslog.SysSmsLogEntity
;
import
com.lyy.admin.mapper.sms.SysSmsLogMapper
;
import
com.lyy.admin.service.sms.SysSmsLogService
;
import
org.springframework.stereotype.Service
;
/**
* @author: zhouxudong
* @version: 1.0
* @createTime: 2023/11/20 15:01
* @description: 短信发送记录表
*/
@Service
public
class
SysSmsLogServiceImpl
extends
ServiceImpl
<
SysSmsLogMapper
,
SysSmsLogEntity
>
implements
SysSmsLogService
{}
src/main/java/com/lyy/admin/service/system/SysCarouselInfoService.java
View file @
9102f3c8
...
...
@@ -15,4 +15,6 @@ public interface SysCarouselInfoService extends IService<SysCarouselInfo> {
public
void
saveCarouselInfo
(
Integer
id
,
List
<
String
>
imgUrls
,
CarouselTypeEnum
carouselTypeEnum
);
public
List
<
String
>
getImgUrls
(
CarouselTypeEnum
carouselTypeEnum
,
Integer
businessId
);
}
src/main/java/com/lyy/admin/service/system/impl/SysCarouselInfoServiceImpl.java
View file @
9102f3c8
package
com
.
lyy
.
admin
.
service
.
system
.
impl
;
import
com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper
;
import
com.baomidou.mybatisplus.extension.service.impl.ServiceImpl
;
import
com.lyy.admin.domain.system.SysCarouselInfo
;
import
com.lyy.admin.enumerate.CarouselTypeEnum
;
import
com.lyy.admin.enumerate.StatusEnum
;
import
com.lyy.admin.enumerate.UrlTypeEnum
;
import
com.lyy.admin.mapper.system.SysCarouselInfoMapper
;
import
com.lyy.admin.service.system.SysCarouselInfoService
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
org.springframework.transaction.annotation.Transactional
;
import
org.springframework.util.CollectionUtils
;
import
java.util.ArrayList
;
import
java.util.List
;
import
java.util.stream.Collectors
;
/**
...
...
@@ -36,10 +41,36 @@ public class SysCarouselInfoServiceImpl extends ServiceImpl<SysCarouselInfoMappe
sysCarouselInfo
.
setAssociationId
(
id
);
sysCarouselInfo
.
setStatus
(
StatusEnum
.
ENABLE
.
getCode
());
sysCarouselInfo
.
setType
(
carouselTypeEnum
.
getType
());
sysCarouselInfo
.
setUrlType
(
UrlTypeEnum
.
PIC
.
getCode
());
sysCarouselInfo
.
setImgUrl
(
url
);
sysCarouselInfoMapper
.
insert
(
sysCarouselInfo
);
}
}
/**
* @description: 获取轮播图
* @date: 2023/11/29 11:59
* @param: [type, businessId]
* @return: java.util.List<java.lang.String>
**/
@Override
public
List
<
String
>
getImgUrls
(
CarouselTypeEnum
carouselTypeEnum
,
Integer
businessId
)
{
List
<
String
>
result
=
new
ArrayList
<>();
LambdaQueryWrapper
<
SysCarouselInfo
>
carouseQuery
=
new
LambdaQueryWrapper
<>();
carouseQuery
.
eq
(
SysCarouselInfo:
:
getType
,
carouselTypeEnum
.
getType
())
.
eq
(
SysCarouselInfo:
:
getAssociationId
,
businessId
)
.
eq
(
SysCarouselInfo:
:
getStatus
,
StatusEnum
.
ENABLE
.
getCode
())
.
eq
(
SysCarouselInfo:
:
getUrlType
,
UrlTypeEnum
.
PIC
.
getCode
())
.
orderByAsc
(
SysCarouselInfo:
:
getOrderNumber
);
List
<
SysCarouselInfo
>
carouselInfoList
=
this
.
list
(
carouseQuery
);
if
(!
CollectionUtils
.
isEmpty
(
carouselInfoList
))
{
result
=
carouselInfoList
.
stream
().
map
(
SysCarouselInfo:
:
getImgUrl
).
collect
(
Collectors
.
toList
());
}
return
result
;
}
}
...
...
src/main/resources/application-dev.yml
View file @
9102f3c8
...
...
@@ -72,4 +72,8 @@ huaweiObs:
endPoint
:
obs.cn-north-4.myhuaweicloud.com
ak
:
5M4SFISSZI2CN4JVPHVI
sk
:
uZIdUJIwO0sKGVY0hltF9I6IbHEmjwCRco5JV7aM
bucketName
:
cfld-hw-obs-01
\ No newline at end of file
bucketName
:
cfld-hw-obs-01
business
:
url
:
thread
:
localhost:8087/lyy/api/threadInfo/v1.0/save
\ No newline at end of file
src/main/resources/application-local.yml
View file @
9102f3c8
...
...
@@ -72,4 +72,8 @@ huaweiObs:
endPoint
:
obs.cn-north-4.myhuaweicloud.com
ak
:
5M4SFISSZI2CN4JVPHVI
sk
:
uZIdUJIwO0sKGVY0hltF9I6IbHEmjwCRco5JV7aM
bucketName
:
cfld-hw-obs-01
\ No newline at end of file
bucketName
:
cfld-hw-obs-01
business
:
url
:
thread
:
localhost:8087/lyy/api/threadInfo/v1.0/save
\ No newline at end of file
src/main/resources/application-prod.yml
View file @
9102f3c8
...
...
@@ -75,4 +75,8 @@ huaweiObs:
bucketName
:
cfld-hw-obs-01
swagger
:
enabled
:
false
\ No newline at end of file
enabled
:
false
business
:
url
:
thread
:
localhost:8087/lyy/api/threadInfo/v1.0/save
\ No newline at end of file
src/main/resources/application-test.yml
View file @
9102f3c8
...
...
@@ -8,7 +8,7 @@ spring:
datasource
:
type
:
com.alibaba.druid.pool.DruidDataSource
driverClassName
:
com.mysql.cj.jdbc.Driver
url
:
jdbc:mysql://rm-2ze10ohzb1898j5qd.mysql.rds.aliyuncs.com:3306/liyeyun?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8&useSSL=true
url
:
jdbc:mysql://rm-2ze10ohzb1898j5qd
fo
.mysql.rds.aliyuncs.com:3306/liyeyun?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8&useSSL=true
username
:
liyeyun
password
:
CF**ldcn
# 初始连接数
...
...
@@ -72,4 +72,8 @@ huaweiObs:
endPoint
:
obs.cn-north-4.myhuaweicloud.com
ak
:
5M4SFISSZI2CN4JVPHVI
sk
:
uZIdUJIwO0sKGVY0hltF9I6IbHEmjwCRco5JV7aM
bucketName
:
cfld-hw-obs-01
\ No newline at end of file
bucketName
:
cfld-hw-obs-01
business
:
url
:
thread
:
localhost:8087/lyy/api/threadInfo/v1.0/save
\ No newline at end of file
src/main/resources/application.yml
View file @
9102f3c8
...
...
@@ -26,7 +26,7 @@ spring:
name
:
cfld-region-outline
# 配置环境切换
profiles
:
active
:
local
active
:
test
# 文件上传
servlet
:
multipart
:
...
...
@@ -87,4 +87,18 @@ swagger:
# * 2、在方法上加@ApiOperationSupport(ignoreParameters = {"PCode"})
#*/
knife4j
:
enable
:
true
\ No newline at end of file
enable
:
true
sms
:
appKey
:
J12997I0SJ988a4Hjmk72WmuP51i
appSecret
:
I6bUKWfZU51i9FSsXGGg9XkN2GRw
appUrl
:
https://smsapi.cn-north-4.myhuaweicloud.com:443/sms/batchSendSms/v1
sender
:
8823112010314
signature
:
立业云
liyeren
:
whiteIp
:
120.46.86.157
#立业人加密密钥
key
:
a5gcCE1MV4j2W9x7
src/main/resources/mapper/sms/SysSmsLogMapper.xml
0 → 100644
View file @
9102f3c8
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper
namespace=
"com.lyy.user.moudle.smslog.mapper.SysSmsLogMapper"
>
</mapper>
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