Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
X
xyqb-user2
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
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
head_group
xyqb-user2
Commits
b851d0de
Commit
b851d0de
authored
Jun 15, 2017
by
技术部—现金贷—曾丽宾
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
添加数据校验,分页导出功能
parent
3bc52883
Changes
10
Show whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
724 additions
and
23 deletions
+724
-23
pom.xml
pom.xml
+7
-0
UserQueryLogController.java
.../controller/external/queryLog/UserQueryLogController.java
+162
-18
PageModel.java
src/main/java/cn/quantgroup/xyqb/model/PageModel.java
+32
-0
IUserDetailRepository.java
.../cn/quantgroup/xyqb/repository/IUserDetailRepository.java
+2
-1
IUserQueryLogRepository.java
...n/quantgroup/xyqb/repository/IUserQueryLogRepository.java
+4
-1
IUserDetailService.java
...a/cn/quantgroup/xyqb/service/user/IUserDetailService.java
+4
-0
IUserQueryLogService.java
...cn/quantgroup/xyqb/service/user/IUserQueryLogService.java
+4
-2
UserDetailServiceImpl.java
...ntgroup/xyqb/service/user/impl/UserDetailServiceImpl.java
+50
-0
UserQueryLogServiceImpl.java
...group/xyqb/service/user/impl/UserQueryLogServiceImpl.java
+6
-1
IdcardValidator.java
src/main/java/cn/quantgroup/xyqb/util/IdcardValidator.java
+453
-0
No files found.
pom.xml
View file @
b851d0de
...
@@ -208,6 +208,13 @@
...
@@ -208,6 +208,13 @@
<version>
1.46
</version>
<version>
1.46
</version>
</dependency>
</dependency>
<!-- POI -->
<dependency>
<groupId>
org.apache.poi
</groupId>
<artifactId>
poi
</artifactId>
<version>
3.10-FINAL
</version>
</dependency>
<dependency>
<dependency>
<groupId>
cn.quantgroup
</groupId>
<groupId>
cn.quantgroup
</groupId>
<artifactId>
quantgroup-config-sdk
</artifactId>
<artifactId>
quantgroup-config-sdk
</artifactId>
...
...
src/main/java/cn/quantgroup/xyqb/controller/external/queryLog/UserQueryLogController.java
View file @
b851d0de
package
cn
.
quantgroup
.
xyqb
.
controller
.
external
.
queryLog
;
package
cn
.
quantgroup
.
xyqb
.
controller
.
external
.
queryLog
;
import
cn.quantgroup.xyqb.entity.Address
;
import
cn.quantgroup.xyqb.entity.Address
;
import
cn.quantgroup.xyqb.entity.User
;
import
cn.quantgroup.xyqb.entity.UserDetail
;
import
cn.quantgroup.xyqb.entity.UserDetail
;
import
cn.quantgroup.xyqb.entity.UserQueryLog
;
import
cn.quantgroup.xyqb.entity.UserQueryLog
;
import
cn.quantgroup.xyqb.model.JsonResult
;
import
cn.quantgroup.xyqb.model.JsonResult
;
import
cn.quantgroup.xyqb.model.PageModel
;
import
cn.quantgroup.xyqb.model.UserQueryInfo
;
import
cn.quantgroup.xyqb.model.UserQueryInfo
;
import
cn.quantgroup.xyqb.service.http.IHttpService
;
import
cn.quantgroup.xyqb.service.http.IHttpService
;
import
cn.quantgroup.xyqb.service.user.IAddressService
;
import
cn.quantgroup.xyqb.service.user.IAddressService
;
import
cn.quantgroup.xyqb.service.user.IUserDetailService
;
import
cn.quantgroup.xyqb.service.user.IUserDetailService
;
import
cn.quantgroup.xyqb.service.user.IUserQueryLogService
;
import
cn.quantgroup.xyqb.service.user.IUserQueryLogService
;
import
cn.quantgroup.xyqb.service.user.IUserService
;
import
com.google.gson.JsonArray
;
import
cn.quantgroup.xyqb.util.IdcardValidator
;
import
com.google.gson.JsonElement
;
import
cn.quantgroup.xyqb.util.ValidationUtil
;
import
com.google.gson.JsonObject
;
import
com.google.gson.JsonParser
;
import
org.slf4j.Logger
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.slf4j.LoggerFactory
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.data.domain.Page
;
import
org.springframework.util.StringUtils
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.RequestParam
;
import
org.springframework.web.bind.annotation.RestController
;
import
org.springframework.web.bind.annotation.RestController
;
import
java.
lang.reflect.Array
;
import
java.
io.OutputStream
;
import
java.text.SimpleDateFormat
;
import
java.text.SimpleDateFormat
;
import
java.util.*
;
import
java.util.*
;
import
org.apache.poi.hssf.usermodel.HSSFCell
;
import
org.apache.poi.hssf.usermodel.HSSFCellStyle
;
import
org.apache.poi.hssf.usermodel.HSSFRow
;
import
org.apache.poi.hssf.usermodel.HSSFSheet
;
import
org.apache.poi.hssf.usermodel.HSSFWorkbook
;
import
javax.servlet.http.HttpServletResponse
;
import
static
com
.
sun
.
xml
.
internal
.
ws
.
api
.
model
.
wsdl
.
WSDLBoundOperation
.
ANONYMOUS
.
required
;
/**
/**
* Created by zenglibin on 17/06/13.
* Created by zenglibin on 17/06/13.
*/
*/
...
@@ -50,35 +62,91 @@ public class UserQueryLogController {
...
@@ -50,35 +62,91 @@ public class UserQueryLogController {
private
IHttpService
httpService
;
private
IHttpService
httpService
;
@RequestMapping
(
"/queryLog"
)
@RequestMapping
(
"/queryLog"
)
public
JsonResult
queryLog
(
Date
beginDate
,
Date
endDate
,
Long
pageId
,
Long
pageSize
)
{
public
JsonResult
queryLog
(
@RequestParam
(
required
=
false
)
String
beginDate
,
@RequestParam
(
required
=
false
)
String
endDate
,
Integer
pageId
,
Integer
pageSize
)
{
try
{
SimpleDateFormat
sf
=
new
SimpleDateFormat
(
"yyyy-MM-DD HH:mm:ss"
);
Date
date1
=
null
,
date2
=
null
;
if
(
beginDate
!=
null
&&
StringUtils
.
hasLength
(
beginDate
)){
date1
=
sf
.
parse
(
beginDate
);
}
else
{
date1
=
new
Date
();
}
if
(
endDate
!=
null
&&
StringUtils
.
hasLength
(
endDate
)){
date2
=
sf
.
parse
(
endDate
);
}
else
{
date2
=
new
Date
();
}
List
<
UserQueryLog
>
userQueryLogs
=
userQueryLogService
.
findByTimestamp
(
date1
,
date2
,
pageId
-
1
,
pageSize
);
Long
total
=
userQueryLogService
.
findByTimestampCount
(
date1
,
date2
);
PageModel
<
UserQueryLog
>
uqp
=
new
PageModel
<
UserQueryLog
>();
uqp
.
setTotal
(
total
);
uqp
.
setPageSize
(
pageSize
);
uqp
.
setPageId
(
pageId
);
uqp
.
setPageList
(
userQueryLogs
);
Double
d
=
Math
.
ceil
(
total
/
pageSize
);
uqp
.
setPages
(
d
.
intValue
());
return
JsonResult
.
buildSuccessResult
(
"查询成功"
,
uqp
);
}
catch
(
Exception
e
){
return
JsonResult
.
buildErrorStateResult
(
"查询失败"
,
null
);
}
List
<
UserQueryLog
>
userQueryLogs
=
userQueryLogService
.
findByTimestamp
(
beginDate
,
endDate
,
pageId
-
1
,
pageSize
);
return
JsonResult
.
buildSuccessResult
(
"查询成功"
,
userQueryLogs
);
}
}
@RequestMapping
(
"/queryUserInfo"
)
@RequestMapping
(
"/queryUserInfo"
)
public
JsonResult
queryForResult
(
String
key
,
String
keyValues
,
String
userName
,
String
columns
,
Long
pageId
,
Long
pageSize
)
{
public
JsonResult
queryForResult
(
String
key
,
String
keyValues
,
String
userName
,
String
columns
,
Integer
pageId
,
Integer
pageSize
)
{
//columns=> userId,phoneNo,idNo,bankCard,address
//columns=> userId,phoneNo,idNo,bankCard,address
//key=>phoneNo、idNo、userId
//key=>phoneNo、idNo、userId
//checkKeysType;
//checkKeysType;
//后台参数校验
String
[]
values
=
keyValues
.
split
(
";"
);
String
[]
values
=
keyValues
.
split
(
";"
);
List
<
String
>
queryV
=
Arrays
.
asList
(
values
);
List
<
String
>
queryV
=
Arrays
.
asList
(
values
);
List
<
UserQueryInfo
>
userQueryInfos
=
new
ArrayList
<
UserQueryInfo
>();
List
<
UserQueryInfo
>
userQueryInfos
=
new
ArrayList
<
UserQueryInfo
>();
Page
<
UserQueryInfo
>
userQueryInfoPage
=
null
;
List
<
UserDetail
>
userDetails
=
new
ArrayList
<
UserDetail
>();
List
<
UserDetail
>
userDetails
=
new
ArrayList
<
UserDetail
>();
Page
<
UserDetail
>
userDetailPage
=
null
;
List
<
Address
>
addresslist
=
new
ArrayList
<
Address
>();
List
<
Address
>
addresslist
=
new
ArrayList
<
Address
>();
if
(
key
.
equals
(
"userId"
)){
if
(
key
.
equals
(
"userId"
)){
List
<
Long
>
userIds
=
new
ArrayList
<
Long
>();
List
<
Long
>
userIds
=
new
ArrayList
<
Long
>();
try
{
for
(
String
s:
queryV
){
for
(
String
s:
queryV
){
if
(
s
.
length
()>
8
){
return
JsonResult
.
buildErrorStateResult
(
"查询的userId长度超过8位"
,
s
);
}
long
uid
=
Long
.
valueOf
(
s
);
long
uid
=
Long
.
valueOf
(
s
);
userIds
.
add
(
uid
);
userIds
.
add
(
uid
);
}
}
userDetails
=
userDetailService
.
findByUserIdIn
(
userIds
);
}
catch
(
Exception
e
){
return
JsonResult
.
buildErrorStateResult
(
"查询的userId有误"
,
null
);
}
userDetailPage
=
userDetailService
.
getUserDetailsPage
(
userIds
,
null
,
null
,
pageId
,
pageSize
,
"auto"
);
}
else
if
(
key
.
equals
(
"phoneNo"
)){
}
else
if
(
key
.
equals
(
"phoneNo"
)){
userDetails
=
userDetailService
.
findByPhoneNos
(
queryV
);
for
(
String
pn:
queryV
){
if
(!
ValidationUtil
.
validatePhoneNo
(
pn
)){
return
JsonResult
.
buildErrorStateResult
(
"查询的手机号码格式有误"
,
pn
);
}
}
userDetailPage
=
userDetailService
.
getUserDetailsPage
(
null
,
queryV
,
null
,
pageId
,
pageSize
,
"auto"
);
}
else
if
(
key
.
equals
(
"idNo"
)){
}
else
if
(
key
.
equals
(
"idNo"
)){
userDetails
=
userDetailService
.
findByIdnos
(
queryV
);
IdcardValidator
iv
=
new
IdcardValidator
();
for
(
String
idno:
queryV
){
if
(!
iv
.
is18Idcard
(
idno
)&&!
iv
.
is15Idcard
(
idno
)){
return
JsonResult
.
buildErrorStateResult
(
"查询的身份证号格式有误"
,
idno
);
}
}
userDetailPage
=
userDetailService
.
getUserDetailsPage
(
null
,
null
,
queryV
,
pageId
,
pageSize
,
"auto"
);
}
if
(
userDetailPage
!=
null
){
userDetails
=
userDetailPage
.
getContent
();
}
}
if
(
columns
.
contains
(
"bankCard"
)){
if
(
columns
.
contains
(
"bankCard"
)){
...
@@ -133,8 +201,14 @@ public class UserQueryLogController {
...
@@ -133,8 +201,14 @@ public class UserQueryLogController {
}
}
userQueryLogService
.
save
(
log
);
userQueryLogService
.
save
(
log
);
PageModel
<
UserQueryInfo
>
uqi
=
new
PageModel
<
UserQueryInfo
>();
uqi
.
setPageId
(
pageId
);
uqi
.
setPageList
(
userQueryInfos
);
uqi
.
setPageSize
(
pageSize
);
uqi
.
setPages
(
userDetailPage
.
getTotalPages
());
uqi
.
setTotal
(
userDetailPage
.
getTotalElements
());
return
JsonResult
.
buildSuccessResult
(
"成功"
,
u
serQueryInfos
);
return
JsonResult
.
buildSuccessResult
(
"成功"
,
u
qi
);
}
}
private
String
getBankCardsByPhoneNos
(
String
phoneNo
){
private
String
getBankCardsByPhoneNos
(
String
phoneNo
){
...
@@ -162,4 +236,74 @@ public class UserQueryLogController {
...
@@ -162,4 +236,74 @@ public class UserQueryLogController {
// return cardList.toString();
// return cardList.toString();
return
null
;
return
null
;
}
}
@RequestMapping
(
"/exportUserInfo"
)
public
void
exportExcel
(
final
HttpServletResponse
response
,
String
key
,
String
keyValues
,
String
userName
,
String
columns
){
List
<
UserQueryInfo
>
uqls
=
new
ArrayList
<
UserQueryInfo
>();
UserQueryInfo
uq
=
new
UserQueryInfo
();
uq
.
setUserId
(
123
l
);
uq
.
setAddress
(
"AAAAAAA"
);
uq
.
setPhoneNo
(
"15840001232"
);
uq
.
setIdNo
(
"362529199701235671"
);
uq
.
setBankCards
(
"6217564445877112"
);
uqls
.
add
(
uq
);
HSSFWorkbook
wb
=
new
HSSFWorkbook
();
// 第二步,在webbook中添加一个sheet,对应Excel文件中的sheet
HSSFSheet
sheet
=
wb
.
createSheet
(
"用户信息列表"
);
// 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制short
HSSFRow
row
=
sheet
.
createRow
((
int
)
0
);
// 第四步,创建单元格,并设置值表头 设置表头居中
HSSFCellStyle
style
=
wb
.
createCellStyle
();
style
.
setAlignment
(
HSSFCellStyle
.
ALIGN_CENTER
);
// 创建一个居中格式
HSSFCell
cell
=
row
.
createCell
((
short
)
0
);
cell
.
setCellValue
(
"userId"
);
cell
.
setCellStyle
(
style
);
cell
=
row
.
createCell
((
short
)
1
);
cell
.
setCellValue
(
"手机号"
);
cell
.
setCellStyle
(
style
);
cell
=
row
.
createCell
((
short
)
2
);
cell
.
setCellValue
(
"身份证号"
);
cell
.
setCellStyle
(
style
);
cell
=
row
.
createCell
((
short
)
3
);
cell
.
setCellValue
(
"银行卡号"
);
cell
.
setCellStyle
(
style
);
cell
=
row
.
createCell
((
short
)
4
);
cell
.
setCellValue
(
"地址"
);
cell
.
setCellStyle
(
style
);
// 第五步,写入实体数据 实际应用中这些数据从数据库得到,
//List list = CreateSimpleExcelToDisk.getStudent();
for
(
int
i
=
0
;
i
<
uqls
.
size
();
i
++)
{
row
=
sheet
.
createRow
((
int
)
i
+
1
);
UserQueryInfo
user
=
(
UserQueryInfo
)
uqls
.
get
(
i
);
// 第四步,创建单元格,并设置值
row
.
createCell
((
short
)
0
).
setCellValue
(
user
.
getUserId
());
row
.
createCell
((
short
)
1
).
setCellValue
(
user
.
getPhoneNo
());
row
.
createCell
((
short
)
2
).
setCellValue
(
user
.
getIdNo
());
row
.
createCell
((
short
)
3
).
setCellValue
(
user
.
getBankCards
());
row
.
createCell
((
short
)
4
).
setCellValue
(
user
.
getAddress
());
}
// 第六步,将文件存到指定位置
try
{
OutputStream
output
=
response
.
getOutputStream
();
response
.
reset
();
response
.
setHeader
(
"Content-disposition"
,
"attachment; filename=users.xls"
);
response
.
setContentType
(
"application/msexcel"
);
wb
.
write
(
output
);
output
.
close
();
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
}
}
}
src/main/java/cn/quantgroup/xyqb/model/PageModel.java
0 → 100644
View file @
b851d0de
package
cn
.
quantgroup
.
xyqb
.
model
;
import
cn.quantgroup.xyqb.entity.User
;
import
cn.quantgroup.xyqb.entity.UserDetail
;
import
lombok.Data
;
import
java.io.Serializable
;
import
java.util.List
;
/**
* Created by zenglibin on 15/12/29.
*/
@Data
public
class
PageModel
<
T
>
implements
Serializable
{
private
static
final
long
serialVersionUID
=
-
1L
;
private
Integer
pageId
;
private
Integer
pageSize
;
private
List
<
T
>
pageList
;
private
Integer
pages
;
private
Long
total
;
public
PageModel
()
{
}
}
src/main/java/cn/quantgroup/xyqb/repository/IUserDetailRepository.java
View file @
b851d0de
...
@@ -3,6 +3,7 @@ package cn.quantgroup.xyqb.repository;
...
@@ -3,6 +3,7 @@ package cn.quantgroup.xyqb.repository;
import
cn.quantgroup.xyqb.entity.UserDetail
;
import
cn.quantgroup.xyqb.entity.UserDetail
;
import
org.springframework.data.jpa.domain.Specification
;
import
org.springframework.data.jpa.domain.Specification
;
import
org.springframework.data.jpa.repository.JpaRepository
;
import
org.springframework.data.jpa.repository.JpaRepository
;
import
org.springframework.data.jpa.repository.JpaSpecificationExecutor
;
import
org.springframework.data.jpa.repository.Modifying
;
import
org.springframework.data.jpa.repository.Modifying
;
import
org.springframework.data.jpa.repository.Query
;
import
org.springframework.data.jpa.repository.Query
;
import
org.springframework.transaction.annotation.Transactional
;
import
org.springframework.transaction.annotation.Transactional
;
...
@@ -13,7 +14,7 @@ import java.util.List;
...
@@ -13,7 +14,7 @@ import java.util.List;
* @author mengfan.feng
* @author mengfan.feng
* @time 2015-09-11 11:22
* @time 2015-09-11 11:22
*/
*/
public
interface
IUserDetailRepository
extends
JpaRepository
<
UserDetail
,
Long
>
{
public
interface
IUserDetailRepository
extends
JpaRepository
<
UserDetail
,
Long
>
,
JpaSpecificationExecutor
<
UserDetail
>
{
UserDetail
findByUserId
(
Long
userId
);
UserDetail
findByUserId
(
Long
userId
);
...
...
src/main/java/cn/quantgroup/xyqb/repository/IUserQueryLogRepository.java
View file @
b851d0de
...
@@ -19,5 +19,8 @@ public interface IUserQueryLogRepository extends JpaRepository<UserQueryLog, Lon
...
@@ -19,5 +19,8 @@ public interface IUserQueryLogRepository extends JpaRepository<UserQueryLog, Lon
@Transactional
@Transactional
@Modifying
@Modifying
@Query
(
nativeQuery
=
true
,
value
=
"select * from user_query_log ul where created_At between ?1 and ?2 limit ?3 ,?4 "
)
@Query
(
nativeQuery
=
true
,
value
=
"select * from user_query_log ul where created_At between ?1 and ?2 limit ?3 ,?4 "
)
List
<
UserQueryLog
>
findQueryLogCreatedAt
(
Date
beginDate
,
Date
endDate
,
Long
pageId
,
Long
pageSize
);
List
<
UserQueryLog
>
findQueryLogCreatedAt
(
Date
beginDate
,
Date
endDate
,
Integer
pageId
,
Integer
pageSize
);
@Query
(
nativeQuery
=
true
,
value
=
"select count(1) from user_query_log ul where created_At between ?1 and ?2 "
)
Long
findQueryLogCountCreatedAt
(
Date
beginDate
,
Date
endDate
);
}
}
src/main/java/cn/quantgroup/xyqb/service/user/IUserDetailService.java
View file @
b851d0de
...
@@ -3,6 +3,7 @@ package cn.quantgroup.xyqb.service.user;
...
@@ -3,6 +3,7 @@ package cn.quantgroup.xyqb.service.user;
import
cn.quantgroup.xyqb.entity.UserDetail
;
import
cn.quantgroup.xyqb.entity.UserDetail
;
import
cn.quantgroup.xyqb.service.user.vo.UserDetailVO
;
import
cn.quantgroup.xyqb.service.user.vo.UserDetailVO
;
import
org.springframework.dao.DataIntegrityViolationException
;
import
org.springframework.dao.DataIntegrityViolationException
;
import
org.springframework.data.domain.Page
;
import
java.util.List
;
import
java.util.List
;
...
@@ -25,4 +26,7 @@ public interface IUserDetailService {
...
@@ -25,4 +26,7 @@ public interface IUserDetailService {
List
<
UserDetail
>
findByPhoneNos
(
List
<
String
>
phoneNos
);
List
<
UserDetail
>
findByPhoneNos
(
List
<
String
>
phoneNos
);
List
<
UserDetail
>
findByIdnos
(
List
<
String
>
idnos
);
List
<
UserDetail
>
findByIdnos
(
List
<
String
>
idnos
);
Page
<
UserDetail
>
getUserDetailsPage
(
List
<
Long
>
userId
,
List
<
String
>
phoneNos
,
List
<
String
>
idNos
,
int
pageNumber
,
int
pageSize
,
String
sortType
);
}
}
src/main/java/cn/quantgroup/xyqb/service/user/IUserQueryLogService.java
View file @
b851d0de
...
@@ -8,11 +8,13 @@ import java.util.Date;
...
@@ -8,11 +8,13 @@ import java.util.Date;
import
java.util.List
;
import
java.util.List
;
/**
/**
* Created by
Miraculous on 2017/1/3
.
* Created by
zenglibin on 2017/06/15
.
*/
*/
public
interface
IUserQueryLogService
{
public
interface
IUserQueryLogService
{
List
<
UserQueryLog
>
findByTimestamp
(
Date
beginDate
,
Date
endDate
,
Long
pageId
,
Long
pageSize
);
List
<
UserQueryLog
>
findByTimestamp
(
Date
beginDate
,
Date
endDate
,
Integer
pageId
,
Integer
pageSize
);
Long
findByTimestampCount
(
Date
beginDate
,
Date
endDate
);
UserQueryLog
save
(
UserQueryLog
userQueryLog
);
UserQueryLog
save
(
UserQueryLog
userQueryLog
);
...
...
src/main/java/cn/quantgroup/xyqb/service/user/impl/UserDetailServiceImpl.java
View file @
b851d0de
...
@@ -2,6 +2,7 @@ package cn.quantgroup.xyqb.service.user.impl;
...
@@ -2,6 +2,7 @@ package cn.quantgroup.xyqb.service.user.impl;
import
cn.quantgroup.xyqb.entity.User
;
import
cn.quantgroup.xyqb.entity.User
;
import
cn.quantgroup.xyqb.entity.UserDetail
;
import
cn.quantgroup.xyqb.entity.UserDetail
;
import
cn.quantgroup.xyqb.model.UserQueryInfo
;
import
cn.quantgroup.xyqb.repository.IUserDetailRepository
;
import
cn.quantgroup.xyqb.repository.IUserDetailRepository
;
import
cn.quantgroup.xyqb.repository.IUserRepository
;
import
cn.quantgroup.xyqb.repository.IUserRepository
;
import
cn.quantgroup.xyqb.service.user.IUserDetailService
;
import
cn.quantgroup.xyqb.service.user.IUserDetailService
;
...
@@ -15,9 +16,15 @@ import javax.persistence.criteria.CriteriaBuilder;
...
@@ -15,9 +16,15 @@ import javax.persistence.criteria.CriteriaBuilder;
import
javax.persistence.criteria.CriteriaQuery
;
import
javax.persistence.criteria.CriteriaQuery
;
import
javax.persistence.criteria.Predicate
;
import
javax.persistence.criteria.Predicate
;
import
javax.persistence.criteria.Root
;
import
javax.persistence.criteria.Root
;
import
javax.transaction.Transactional
;
import
org.apache.commons.lang.StringUtils
;
import
org.apache.commons.lang.StringUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.dao.DataIntegrityViolationException
;
import
org.springframework.dao.DataIntegrityViolationException
;
import
org.springframework.data.domain.Page
;
import
org.springframework.data.domain.PageRequest
;
import
org.springframework.data.domain.Pageable
;
import
org.springframework.data.domain.Sort
;
import
org.springframework.data.jpa.domain.Specification
;
import
org.springframework.data.jpa.domain.Specification
;
import
org.springframework.stereotype.Service
;
import
org.springframework.stereotype.Service
;
import
org.springframework.util.CollectionUtils
;
import
org.springframework.util.CollectionUtils
;
...
@@ -125,4 +132,47 @@ public class UserDetailServiceImpl implements IUserDetailService {
...
@@ -125,4 +132,47 @@ public class UserDetailServiceImpl implements IUserDetailService {
}
}
return
userDetailVO
;
return
userDetailVO
;
}
}
private
Specification
<
UserDetail
>
valueInSpecification
(
List
<
Long
>
userId
,
List
<
String
>
phoneNo
,
List
<
String
>
idNo
)
{
List
<
Predicate
>
list
=
new
ArrayList
<>();
Specification
<
UserDetail
>
specification
=
new
Specification
<
UserDetail
>()
{
@Override
public
Predicate
toPredicate
(
Root
<
UserDetail
>
root
,
CriteriaQuery
<?>
criteriaQuery
,
CriteriaBuilder
criteriaBuilder
)
{
if
(
userId
!=
null
&&
userId
.
size
()>
0
)
{
criteriaQuery
.
where
(
root
.
get
(
"userId"
).
in
(
userId
));
list
.
add
(
criteriaQuery
.
getRestriction
());
}
if
(
phoneNo
!=
null
&&
phoneNo
.
size
()>
0
)
{
criteriaQuery
.
where
(
root
.
get
(
"phoneNo"
).
in
(
phoneNo
));
list
.
add
(
criteriaQuery
.
getRestriction
());
}
if
(
idNo
!=
null
&&
idNo
.
size
()>
0
)
{
criteriaQuery
.
where
(
root
.
get
(
"idNo"
).
in
(
idNo
));
list
.
add
(
criteriaQuery
.
getRestriction
());
}
Predicate
[]
p
=
new
Predicate
[
list
.
size
()];
return
criteriaBuilder
.
and
(
list
.
toArray
(
p
));
}
};
return
specification
;
}
private
PageRequest
buildPageRequest
(
int
pageNumber
,
int
pagzSize
,
String
sortType
)
{
Sort
sort
=
null
;
if
(
"auto"
.
equals
(
sortType
))
{
sort
=
new
Sort
(
Sort
.
Direction
.
DESC
,
"userId"
);
}
return
new
PageRequest
(
pageNumber
-
1
,
pagzSize
,
sort
);
}
public
Page
<
UserDetail
>
getUserDetailsPage
(
List
<
Long
>
userId
,
List
<
String
>
phoneNos
,
List
<
String
>
idNos
,
int
pageNumber
,
int
pageSize
,
String
sortType
)
{
PageRequest
pageRequest
=
buildPageRequest
(
pageNumber
,
pageSize
,
sortType
);
Specification
<
UserDetail
>
spec
=
valueInSpecification
(
userId
,
phoneNos
,
idNos
);
return
userDetailRepository
.
findAll
(
spec
,
pageRequest
);
}
}
}
src/main/java/cn/quantgroup/xyqb/service/user/impl/UserQueryLogServiceImpl.java
View file @
b851d0de
...
@@ -20,10 +20,15 @@ public class UserQueryLogServiceImpl implements IUserQueryLogService {
...
@@ -20,10 +20,15 @@ public class UserQueryLogServiceImpl implements IUserQueryLogService {
private
IUserQueryLogRepository
userQueryLogRepository
;
private
IUserQueryLogRepository
userQueryLogRepository
;
@Override
@Override
public
List
<
UserQueryLog
>
findByTimestamp
(
Date
beginDate
,
Date
endDate
,
Long
pageId
,
Long
pageSize
)
{
public
List
<
UserQueryLog
>
findByTimestamp
(
Date
beginDate
,
Date
endDate
,
Integer
pageId
,
Integer
pageSize
)
{
return
userQueryLogRepository
.
findQueryLogCreatedAt
(
beginDate
,
endDate
,
pageId
,
pageSize
);
return
userQueryLogRepository
.
findQueryLogCreatedAt
(
beginDate
,
endDate
,
pageId
,
pageSize
);
}
}
@Override
public
Long
findByTimestampCount
(
Date
beginDate
,
Date
endDate
)
{
return
userQueryLogRepository
.
findQueryLogCountCreatedAt
(
beginDate
,
endDate
);
}
@Override
@Override
public
UserQueryLog
save
(
UserQueryLog
userQueryLog
)
{
public
UserQueryLog
save
(
UserQueryLog
userQueryLog
)
{
return
userQueryLogRepository
.
save
(
userQueryLog
);
return
userQueryLogRepository
.
save
(
userQueryLog
);
...
...
src/main/java/cn/quantgroup/xyqb/util/IdcardValidator.java
0 → 100644
View file @
b851d0de
package
cn
.
quantgroup
.
xyqb
.
util
;
/**
* Created by abe on 2017/6/15.
*/
/**
* 身份证前6位【ABCDEF】为行政区划数字代码(简称数字码)说明(参考《GB/T 2260-2007 中华人民共和国行政区划代码》):
* 该数字码的编制原则和结构分析,它采用三层六位层次码结构,按层次分别表示我国各省(自治区,直辖市,特别行政区)、
* 市(地区,自治州,盟)、县(自治县、县级市、旗、自治旗、市辖区、林区、特区)。
数字码码位结构从左至右的含义是:
第一层为AB两位代码表示省、自治区、直辖市、特别行政区;
第二层为CD两位代码表示市、地区、自治州、盟、直辖市所辖市辖区、县汇总码、省(自治区)直辖县级行政区划汇总码,其中:
——01~20、51~70表示市,01、02还用于表示直辖市所辖市辖区、县汇总码;
——21~50表示地区、自治州、盟;
——90表示省(自治区)直辖县级行政区划汇总码。
第三层为EF两位表示县、自治县、县级市、旗、自治旗、市辖区、林区、特区,其中:
——01~20表示市辖区、地区(自治州、盟)辖县级市、市辖特区以及省(自治区)直辖县级行政区划中的县级市,01通常表示辖区汇总码;
——21~80表示县、自治县、旗、自治旗、林区、地区辖特区;
——81~99表示省(自治区)辖县级市。
*/
import
java.text.ParseException
;
import
java.text.SimpleDateFormat
;
import
java.util.Calendar
;
import
java.util.Date
;
import
java.util.GregorianCalendar
;
import
java.util.HashMap
;
import
java.util.Map
;
import
java.util.regex.Pattern
;
/**
* <p>
* 类说明:身份证合法性校验
* </p>
* <p>
* --15位身份证号码:第7、8位为出生年份(两位数),第9、10位为出生月份,第11、12位代表出生日期,第15位代表性别,奇数为男,偶数为女。
* --18位身份证号码
* :第7、8、9、10位为出生年份(四位数),第11、第12位为出生月份,第13、14位代表出生日期,第17位代表性别,奇数为男,偶数为女。
* </p>
*/
@SuppressWarnings
({
"unchecked"
,
"unused"
,
"all"
})
public
class
IdcardValidator
{
/**
* 省,直辖市代码表: { 11:"北京",12:"天津",13:"河北",14:"山西",15:"内蒙古",
* 21:"辽宁",22:"吉林",23:"黑龙江",31:"上海",32:"江苏",
* 33:"浙江",34:"安徽",35:"福建",36:"江西",37:"山东",41:"河南",
* 42:"湖北",43:"湖南",44:"广东",45:"广西",46:"海南",50:"重庆",
* 51:"四川",52:"贵州",53:"云南",54:"西藏",61:"陕西",62:"甘肃",
* 63:"青海",64:"宁夏",65:"新疆",71:"台湾",81:"香港",82:"澳门",91:"国外"}
*/
protected
String
codeAndCity
[][]
=
{
{
"11"
,
"北京"
},
{
"12"
,
"天津"
},
{
"13"
,
"河北"
},
{
"14"
,
"山西"
},
{
"15"
,
"内蒙古"
},
{
"21"
,
"辽宁"
},
{
"22"
,
"吉林"
},
{
"23"
,
"黑龙江"
},
{
"31"
,
"上海"
},
{
"32"
,
"江苏"
},
{
"33"
,
"浙江"
},
{
"34"
,
"安徽"
},
{
"35"
,
"福建"
},
{
"36"
,
"江西"
},
{
"37"
,
"山东"
},
{
"41"
,
"河南"
},
{
"42"
,
"湖北"
},
{
"43"
,
"湖南"
},
{
"44"
,
"广东"
},
{
"45"
,
"广西"
},
{
"46"
,
"海南"
},
{
"50"
,
"重庆"
},
{
"51"
,
"四川"
},
{
"52"
,
"贵州"
},
{
"53"
,
"云南"
},
{
"54"
,
"西藏"
},
{
"61"
,
"陕西"
},
{
"62"
,
"甘肃"
},
{
"63"
,
"青海"
},
{
"64"
,
"宁夏"
},
{
"65"
,
"新疆"
},
{
"71"
,
"台湾"
},
{
"81"
,
"香港"
},
{
"82"
,
"澳门"
},
{
"91"
,
"国外"
}
};
private
String
cityCode
[]
=
{
"11"
,
"12"
,
"13"
,
"14"
,
"15"
,
"21"
,
"22"
,
"23"
,
"31"
,
"32"
,
"33"
,
"34"
,
"35"
,
"36"
,
"37"
,
"41"
,
"42"
,
"43"
,
"44"
,
"45"
,
"46"
,
"50"
,
"51"
,
"52"
,
"53"
,
"54"
,
"61"
,
"62"
,
"63"
,
"64"
,
"65"
,
"71"
,
"81"
,
"82"
,
"91"
};
// 每位加权因子
private
int
power
[]
=
{
7
,
9
,
10
,
5
,
8
,
4
,
2
,
1
,
6
,
3
,
7
,
9
,
10
,
5
,
8
,
4
,
2
};
// 第18位校检码
private
String
verifyCode
[]
=
{
"1"
,
"0"
,
"X"
,
"9"
,
"8"
,
"7"
,
"6"
,
"5"
,
"4"
,
"3"
,
"2"
};
/**
* 验证所有的身份证的合法性
*
* @param idcard
* @return
*/
public
boolean
isValidatedAllIdcard
(
String
idcard
)
{
if
(
idcard
.
length
()
==
15
)
{
idcard
=
this
.
convertIdcarBy15bit
(
idcard
);
}
return
this
.
isValidate18Idcard
(
idcard
);
}
/**
* <p>
* 判断18位身份证的合法性
* </p>
* 根据〖中华人民共和国国家标准GB11643-1999〗中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。
* 排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。
* <p>
* 顺序码: 表示在同一地址码所标识的区域范围内,对同年、同月、同 日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配 给女性。
* </p>
* <p>
* 1.前1、2位数字表示:所在省份的代码; 2.第3、4位数字表示:所在城市的代码; 3.第5、6位数字表示:所在区县的代码;
* 4.第7~14位数字表示:出生年、月、日; 5.第15、16位数字表示:所在地的派出所的代码;
* 6.第17位数字表示性别:奇数表示男性,偶数表示女性;
* 7.第18位数字是校检码:也有的说是个人信息码,一般是随计算机的随机产生,用来检验身份证的正确性。校检码可以是0~9的数字,有时也用x表示。
* </p>
* <p>
* 第十八位数字(校验码)的计算方法为: 1.将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7 9 10 5 8 4
* 2 1 6 3 7 9 10 5 8 4 2
* </p>
* <p>
* 2.将这17位数字和系数相乘的结果相加。
* </p>
* <p>
* 3.用加出来和除以11,看余数是多少?
* </p>
* 4.余数只可能有0 1 2 3 4 5 6 7 8 9 10这11个数字。其分别对应的最后一位身份证的号码为1 0 X 9 8 7 6 5 4 3
* 2。
* <p>
* 5.通过上面得知如果余数是2,就会在身份证的第18位数字上出现罗马数字的Ⅹ。如果余数是10,身份证的最后一位号码就是2。
* </p>
*
* @param idcard
* @return
*/
public
boolean
isValidate18Idcard
(
String
idcard
)
{
// 非18位为假
if
(
idcard
.
length
()
!=
18
)
{
return
false
;
}
// 获取前17位
String
idcard17
=
idcard
.
substring
(
0
,
17
);
// 获取第18位
String
idcard18Code
=
idcard
.
substring
(
17
,
18
);
char
c
[]
=
null
;
String
checkCode
=
""
;
// 是否都为数字
if
(
isDigital
(
idcard17
))
{
c
=
idcard17
.
toCharArray
();
}
else
{
return
false
;
}
if
(
null
!=
c
)
{
int
bit
[]
=
new
int
[
idcard17
.
length
()];
bit
=
converCharToInt
(
c
);
int
sum17
=
0
;
sum17
=
getPowerSum
(
bit
);
// 将和值与11取模得到余数进行校验码判断
checkCode
=
getCheckCodeBySum
(
sum17
);
if
(
null
==
checkCode
)
{
return
false
;
}
// 将身份证的第18位与算出来的校码进行匹配,不相等就为假
if
(!
idcard18Code
.
equalsIgnoreCase
(
checkCode
))
{
return
false
;
}
}
return
true
;
}
/**
* 验证15位身份证的合法性,该方法验证不准确,最好是将15转为18位后再判断,该类中已提供。
*
* @param idcard
* @return
*/
public
boolean
isValidate15Idcard
(
String
idcard
)
{
// 非15位为假
if
(
idcard
.
length
()
!=
15
)
{
return
false
;
}
// 是否全都为数字
if
(
isDigital
(
idcard
))
{
String
provinceid
=
idcard
.
substring
(
0
,
2
);
String
birthday
=
idcard
.
substring
(
6
,
12
);
int
year
=
Integer
.
parseInt
(
idcard
.
substring
(
6
,
8
));
int
month
=
Integer
.
parseInt
(
idcard
.
substring
(
8
,
10
));
int
day
=
Integer
.
parseInt
(
idcard
.
substring
(
10
,
12
));
// 判断是否为合法的省份
boolean
flag
=
false
;
for
(
String
id
:
cityCode
)
{
if
(
id
.
equals
(
provinceid
))
{
flag
=
true
;
break
;
}
}
if
(!
flag
)
{
return
false
;
}
// 该身份证生出日期在当前日期之后时为假
Date
birthdate
=
null
;
try
{
birthdate
=
new
SimpleDateFormat
(
"yyMMdd"
).
parse
(
birthday
);
}
catch
(
ParseException
e
)
{
e
.
printStackTrace
();
}
if
(
birthdate
==
null
||
new
Date
().
before
(
birthdate
))
{
return
false
;
}
// 判断是否为合法的年份
GregorianCalendar
curDay
=
new
GregorianCalendar
();
int
curYear
=
curDay
.
get
(
Calendar
.
YEAR
);
int
year2bit
=
Integer
.
parseInt
(
String
.
valueOf
(
curYear
)
.
substring
(
2
));
// 判断该年份的两位表示法,小于50的和大于当前年份的,为假
if
((
year
<
50
&&
year
>
year2bit
))
{
return
false
;
}
// 判断是否为合法的月份
if
(
month
<
1
||
month
>
12
)
{
return
false
;
}
// 判断是否为合法的日期
boolean
mflag
=
false
;
curDay
.
setTime
(
birthdate
);
// 将该身份证的出生日期赋于对象curDay
switch
(
month
)
{
case
1
:
case
3
:
case
5
:
case
7
:
case
8
:
case
10
:
case
12
:
mflag
=
(
day
>=
1
&&
day
<=
31
);
break
;
case
2
:
// 公历的2月非闰年有28天,闰年的2月是29天。
if
(
curDay
.
isLeapYear
(
curDay
.
get
(
Calendar
.
YEAR
)))
{
mflag
=
(
day
>=
1
&&
day
<=
29
);
}
else
{
mflag
=
(
day
>=
1
&&
day
<=
28
);
}
break
;
case
4
:
case
6
:
case
9
:
case
11
:
mflag
=
(
day
>=
1
&&
day
<=
30
);
break
;
}
if
(!
mflag
)
{
return
false
;
}
}
else
{
return
false
;
}
return
true
;
}
/**
* 将15位的身份证转成18位身份证
*
* @param idcard
* @return
*/
public
String
convertIdcarBy15bit
(
String
idcard
)
{
String
idcard17
=
null
;
// 非15位身份证
if
(
idcard
.
length
()
!=
15
)
{
return
null
;
}
if
(
isDigital
(
idcard
))
{
// 获取出生年月日
String
birthday
=
idcard
.
substring
(
6
,
12
);
Date
birthdate
=
null
;
try
{
birthdate
=
new
SimpleDateFormat
(
"yyMMdd"
).
parse
(
birthday
);
}
catch
(
ParseException
e
)
{
e
.
printStackTrace
();
}
Calendar
cday
=
Calendar
.
getInstance
();
cday
.
setTime
(
birthdate
);
String
year
=
String
.
valueOf
(
cday
.
get
(
Calendar
.
YEAR
));
idcard17
=
idcard
.
substring
(
0
,
6
)
+
year
+
idcard
.
substring
(
8
);
char
c
[]
=
idcard17
.
toCharArray
();
String
checkCode
=
""
;
if
(
null
!=
c
)
{
int
bit
[]
=
new
int
[
idcard17
.
length
()];
// 将字符数组转为整型数组
bit
=
converCharToInt
(
c
);
int
sum17
=
0
;
sum17
=
getPowerSum
(
bit
);
// 获取和值与11取模得到余数进行校验码
checkCode
=
getCheckCodeBySum
(
sum17
);
// 获取不到校验位
if
(
null
==
checkCode
)
{
return
null
;
}
// 将前17位与第18位校验码拼接
idcard17
+=
checkCode
;
}
}
else
{
// 身份证包含数字
return
null
;
}
return
idcard17
;
}
/**
* 15位和18位身份证号码的基本数字和位数验校
*
* @param idcard
* @return
*/
public
boolean
isIdcard
(
String
idcard
)
{
return
idcard
==
null
||
""
.
equals
(
idcard
)
?
false
:
Pattern
.
matches
(
"(^\\d{15}$)|(\\d{17}(?:\\d|x|X)$)"
,
idcard
);
}
/**
* 15位身份证号码的基本数字和位数验校
*
* @param idcard
* @return
*/
public
boolean
is15Idcard
(
String
idcard
)
{
return
idcard
==
null
||
""
.
equals
(
idcard
)
?
false
:
Pattern
.
matches
(
"^[1-9]\\d{7}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}$"
,
idcard
);
}
/**
* 18位身份证号码的基本数字和位数验校
*
* @param idcard
* @return
*/
public
boolean
is18Idcard
(
String
idcard
)
{
return
Pattern
.
matches
(
"^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}([\\d|x|X]{1})$"
,
idcard
);
}
/**
* 数字验证
*
* @param str
* @return
*/
public
boolean
isDigital
(
String
str
)
{
return
str
==
null
||
""
.
equals
(
str
)
?
false
:
str
.
matches
(
"^[0-9]*$"
);
}
/**
* 将身份证的每位和对应位的加权因子相乘之后,再得到和值
*
* @param bit
* @return
*/
public
int
getPowerSum
(
int
[]
bit
)
{
int
sum
=
0
;
if
(
power
.
length
!=
bit
.
length
)
{
return
sum
;
}
for
(
int
i
=
0
;
i
<
bit
.
length
;
i
++)
{
for
(
int
j
=
0
;
j
<
power
.
length
;
j
++)
{
if
(
i
==
j
)
{
sum
=
sum
+
bit
[
i
]
*
power
[
j
];
}
}
}
return
sum
;
}
/**
* 将和值与11取模得到余数进行校验码判断
*
* @param checkCode
* @param sum17
* @return 校验位
*/
public
String
getCheckCodeBySum
(
int
sum17
)
{
String
checkCode
=
null
;
switch
(
sum17
%
11
)
{
case
10
:
checkCode
=
"2"
;
break
;
case
9
:
checkCode
=
"3"
;
break
;
case
8
:
checkCode
=
"4"
;
break
;
case
7
:
checkCode
=
"5"
;
break
;
case
6
:
checkCode
=
"6"
;
break
;
case
5
:
checkCode
=
"7"
;
break
;
case
4
:
checkCode
=
"8"
;
break
;
case
3
:
checkCode
=
"9"
;
break
;
case
2
:
checkCode
=
"x"
;
break
;
case
1
:
checkCode
=
"0"
;
break
;
case
0
:
checkCode
=
"1"
;
break
;
}
return
checkCode
;
}
/**
* 将字符数组转为整型数组
*
* @param c
* @return
* @throws NumberFormatException
*/
public
int
[]
converCharToInt
(
char
[]
c
)
throws
NumberFormatException
{
int
[]
a
=
new
int
[
c
.
length
];
int
k
=
0
;
for
(
char
temp
:
c
)
{
a
[
k
++]
=
Integer
.
parseInt
(
String
.
valueOf
(
temp
));
}
return
a
;
}
// public static void main(String[] args) throws Exception {
//
// String idcard15 = "142431199001145";//15位
// String idcard18 = "121212121212121212";//18位
// IdcardValidator iv = new IdcardValidator();
// System.out.println(iv.isValidatedAllIdcard(idcard15));
// System.out.println(iv.isValidatedAllIdcard(idcard18));
//
// }
}
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