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
538c2d77
Commit
538c2d77
authored
Aug 14, 2023
by
唐峰
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
个人信息编辑更新,消费地图历史数据清洗接口,微信登录校验绑定用户id情况
parent
41fa853a
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
189 additions
and
1 deletion
+189
-1
OauthApiV2Controller.java
...antgroup/xyqb/controller/api/v2/OauthApiV2Controller.java
+11
-0
UserInfoConvertReq.java
...quantgroup/xyqb/controller/req/v2/UserInfoConvertReq.java
+34
-0
BizExceptionEnum.java
...n/java/cn/quantgroup/xyqb/exception/BizExceptionEnum.java
+1
-0
LoginContext.java
...main/java/cn/quantgroup/xyqb/service/v2/LoginContext.java
+138
-1
WechatMiniLoginStrategy.java
...n/quantgroup/xyqb/service/v2/WechatMiniLoginStrategy.java
+5
-0
No files found.
src/main/java/cn/quantgroup/xyqb/controller/api/v2/OauthApiV2Controller.java
View file @
538c2d77
...
...
@@ -2,6 +2,7 @@ package cn.quantgroup.xyqb.controller.api.v2;
import
cn.quantgroup.xyqb.controller.IBaseController
;
import
cn.quantgroup.xyqb.controller.req.v2.LoginReq
;
import
cn.quantgroup.xyqb.controller.req.v2.UserInfoConvertReq
;
import
cn.quantgroup.xyqb.model.ClientType
;
import
cn.quantgroup.xyqb.model.JsonResult
;
import
cn.quantgroup.xyqb.model.LoginBean
;
...
...
@@ -37,4 +38,14 @@ public class OauthApiV2Controller implements IBaseController {
}
return
JsonResult
.
buildSuccessResultGeneric
(
loginContext
.
interLogin
(
loginReq
));
}
@PostMapping
(
"/shop-map/user-data-convert"
)
public
JsonResult
<
UserInfoConvertReq
>
shopMapDataConvert
(
@RequestBody
UserInfoConvertReq
req
){
//手机号是否存在--注册 登录
//微信是否存在- 若存在,和手机号是否匹配相同
//头像昵称
return
JsonResult
.
buildSuccessResultGeneric
(
loginContext
.
shopMapDataConvert
(
req
));
}
}
src/main/java/cn/quantgroup/xyqb/controller/req/v2/UserInfoConvertReq.java
0 → 100644
View file @
538c2d77
package
cn
.
quantgroup
.
xyqb
.
controller
.
req
.
v2
;
import
cn.quantgroup.xyqb.entity.User
;
import
cn.quantgroup.xyqb.entity.UserInfoEntity
;
import
cn.quantgroup.xyqb.entity.WechatUserInfo
;
import
cn.quantgroup.xyqb.model.ClientType
;
import
com.alibaba.fastjson.JSONObject
;
import
lombok.Data
;
import
javax.validation.constraints.NotNull
;
import
java.util.List
;
@Data
public
class
UserInfoConvertReq
{
//转换的信息
private
List
<
UserConvertInfo
>
userConvertInfoList
;
private
Integer
tenantId
;
//小程序的appId
private
String
appId
;
@Data
public
static
class
UserConvertInfo
{
//传递参数: phoneNo registeredFrom createdAt updatedAt
private
User
user
;
//openId appName unionId nickName headImgUrl appId
private
WechatUserInfo
wechatUserInfo
;
// nickName photo birthday
private
UserInfoEntity
userInfoEntity
;
}
}
src/main/java/cn/quantgroup/xyqb/exception/BizExceptionEnum.java
View file @
538c2d77
...
...
@@ -26,6 +26,7 @@ public enum BizExceptionEnum {
UN_PERMISSION_STMS
(
"1015"
,
"没有内部接口访问权限"
),
EXPIRE_WECHAT_TOKEN
(
"1016"
,
"微信接口token过期,请执行定时任务"
),
ERROR_MATCHING_WECHAT_APP_ID
(
"1017"
,
"微信appName和appId不匹配"
),
ERROR_WECHAT_BIND_USERID
(
"1018"
,
"微信未和用户绑定,登录失败"
),
...
...
src/main/java/cn/quantgroup/xyqb/service/v2/LoginContext.java
View file @
538c2d77
package
cn
.
quantgroup
.
xyqb
.
service
.
v2
;
import
cn.quantgroup.xyqb.controller.req.v2.LoginReq
;
import
cn.quantgroup.xyqb.controller.req.v2.UserInfoConvertReq
;
import
cn.quantgroup.xyqb.entity.User
;
import
cn.quantgroup.xyqb.entity.UserInfoEntity
;
import
cn.quantgroup.xyqb.entity.UserTag
;
import
cn.quantgroup.xyqb.entity.WechatUserInfo
;
import
cn.quantgroup.xyqb.event.UserLoginEvent
;
import
cn.quantgroup.xyqb.exception.BizException
;
import
cn.quantgroup.xyqb.exception.BizExceptionEnum
;
import
cn.quantgroup.xyqb.model.JsonResult
;
import
cn.quantgroup.xyqb.model.LoginBean
;
import
cn.quantgroup.xyqb.model.UserInfo
;
import
cn.quantgroup.xyqb.model.session.SessionStruct
;
import
cn.quantgroup.xyqb.model.v2.login.BaseLoginParam
;
import
cn.quantgroup.xyqb.repository.IUserInfoRepository
;
import
cn.quantgroup.xyqb.repository.IUserRepository
;
import
cn.quantgroup.xyqb.repository.IWeChatUserRepository
;
import
cn.quantgroup.xyqb.session.XyqbSessionContextHolder
;
import
com.alibaba.fastjson.JSONObject
;
import
com.google.common.collect.Lists
;
import
com.google.common.collect.Maps
;
import
lombok.extern.slf4j.Slf4j
;
import
org.apache.commons.collections.CollectionUtils
;
import
org.apache.commons.lang3.StringUtils
;
import
org.springframework.context.ApplicationEventPublisher
;
import
org.springframework.stereotype.Service
;
import
org.springframework.web.bind.annotation.RequestBody
;
import
java.util.Collection
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.UUID
;
import
java.util.function.Function
;
import
java.util.stream.Collectors
;
@Service
@Slf4j
public
class
LoginContext
{
private
final
ApplicationEventPublisher
applicationEventPublisher
;
private
final
IUserRepository
userRepository
;
private
final
IUserInfoRepository
userInfoRepository
;
private
final
IWeChatUserRepository
weChatUserRepository
;
private
final
Map
<
Integer
,
LoginStrategy
>
interloginStrategyMap
=
new
HashMap
<>();
public
LoginContext
(
List
<
LoginStrategy
>
loginStrategies
,
ApplicationEventPublisher
applicationEventPublisher
,
IUserRepository
userRepository
,
IUserInfoRepository
userInfoRepository
)
{
public
LoginContext
(
List
<
LoginStrategy
>
loginStrategies
,
ApplicationEventPublisher
applicationEventPublisher
,
IUserRepository
userRepository
,
IUserInfoRepository
userInfoRepository
,
IWeChatUserRepository
weChatUserRepository
)
{
this
.
applicationEventPublisher
=
applicationEventPublisher
;
this
.
userRepository
=
userRepository
;
this
.
userInfoRepository
=
userInfoRepository
;
this
.
weChatUserRepository
=
weChatUserRepository
;
loginStrategies
.
forEach
(
i
->
interloginStrategyMap
.
put
(
i
.
getType
(),
i
));
}
...
...
@@ -94,4 +112,123 @@ public class LoginContext {
return
loginBean
;
}
/**
* 消费地图历史数据清洗转换
*/
public
UserInfoConvertReq
shopMapDataConvert
(
UserInfoConvertReq
req
){
List
<
UserInfoConvertReq
.
UserConvertInfo
>
userConvertInfoList
=
req
.
getUserConvertInfoList
();
if
(
CollectionUtils
.
isEmpty
(
userConvertInfoList
)
||
userConvertInfoList
.
get
(
0
).
getUser
()
==
null
)
{
throw
new
BizException
(
BizExceptionEnum
.
ERROR_PARAM
);
}
Map
<
String
,
User
>
phoneUserMap
=
Maps
.
newHashMap
();
Map
<
String
,
UserInfoEntity
>
phoneUserEntityMap
=
Maps
.
newHashMap
();
Map
<
String
,
WechatUserInfo
>
phoneWechatUserMap
=
Maps
.
newHashMap
();
List
<
String
>
phoneNoList
=
Lists
.
newArrayList
();
for
(
UserInfoConvertReq
.
UserConvertInfo
convertInfo
:
userConvertInfoList
)
{
phoneUserMap
.
put
(
convertInfo
.
getUser
().
getPhoneNo
(),
convertInfo
.
getUser
());
phoneUserEntityMap
.
put
(
convertInfo
.
getUser
().
getPhoneNo
(),
convertInfo
.
getUserInfoEntity
());
phoneWechatUserMap
.
put
(
convertInfo
.
getUser
().
getPhoneNo
(),
convertInfo
.
getWechatUserInfo
());
phoneNoList
.
add
(
convertInfo
.
getUser
().
getPhoneNo
());
}
//用户注册
List
<
User
>
registerUserList
=
registerUser
(
phoneNoList
,
phoneUserMap
,
req
.
getTenantId
());
List
<
Long
>
userIdList
=
registerUserList
.
stream
().
map
(
e
->
e
.
getId
()).
collect
(
Collectors
.
toList
());
//用户扩展信息
Map
<
Long
,
UserInfoEntity
>
userIdEntityMapQuery
=
Maps
.
newHashMap
();
List
<
UserInfoEntity
>
userInfoEntityListQuery
=
userInfoRepository
.
findByTenantIdAndUserIdIn
(
req
.
getTenantId
(),
userIdList
);
if
(
CollectionUtils
.
isNotEmpty
(
userInfoEntityListQuery
))
{
userIdEntityMapQuery
=
userInfoEntityListQuery
.
stream
().
collect
(
Collectors
.
toMap
(
UserInfoEntity:
:
getUserId
,
Function
.
identity
(),
(
k1
,
k2
)
->
k1
));
}
//用户微信信息
List
<
String
>
openIdList
=
phoneWechatUserMap
.
values
().
stream
().
map
(
e
->
e
.
getOpenId
()).
collect
(
Collectors
.
toList
());
List
<
WechatUserInfo
>
wechatUserInfoListQuery
=
weChatUserRepository
.
findByOpenIdInAndAppIdAndTenantId
(
openIdList
,
req
.
getAppId
(),
req
.
getTenantId
());
Map
<
Long
,
WechatUserInfo
>
userIdWechatMapQuery
=
Maps
.
newHashMap
();
if
(
CollectionUtils
.
isNotEmpty
(
wechatUserInfoListQuery
))
{
userIdWechatMapQuery
=
wechatUserInfoListQuery
.
stream
().
collect
(
Collectors
.
toMap
(
WechatUserInfo:
:
getUserId
,
Function
.
identity
(),
(
k1
,
k2
)
->
k1
));
}
for
(
User
user
:
registerUserList
)
{
UserInfoEntity
userInfoEntity
=
phoneUserEntityMap
.
get
(
user
.
getPhoneNo
());
if
(
userInfoEntity
!=
null
&&
userIdEntityMapQuery
.
get
(
user
.
getId
())
==
null
)
{
userInfoEntity
.
setUserId
(
user
.
getId
());
userInfoEntity
.
setTenantId
(
req
.
getTenantId
());
}
else
if
(
userInfoEntity
!=
null
&&
userIdEntityMapQuery
.
get
(
user
.
getId
())
!=
null
)
{
log
.
info
(
"用户扩展信息已存在,userId:{},用户信息:{}"
,
user
.
getId
(),
JSONObject
.
toJSONString
(
userInfoEntity
));
}
//微信头像昵称正常存储
WechatUserInfo
wechatUserInfo
=
phoneWechatUserMap
.
get
(
user
.
getPhoneNo
());
if
(
wechatUserInfo
!=
null
&&
userIdWechatMapQuery
.
get
(
user
.
getId
())
==
null
)
{
wechatUserInfo
.
setUserId
(
user
.
getId
());
wechatUserInfo
.
setTenantId
(
req
.
getTenantId
());
}
else
if
(
wechatUserInfo
!=
null
&&
userIdWechatMapQuery
.
get
(
user
.
getId
())
==
null
)
{
log
.
info
(
"用户微信信息已存在,userId:{},用户信息:{}"
,
user
.
getId
(),
JSONObject
.
toJSONString
(
wechatUserInfo
));
}
}
Collection
<
WechatUserInfo
>
wechatUserInfos
=
phoneWechatUserMap
.
values
();
if
(
CollectionUtils
.
isNotEmpty
(
wechatUserInfos
))
{
weChatUserRepository
.
save
(
wechatUserInfos
);
}
Collection
<
UserInfoEntity
>
entities
=
phoneUserEntityMap
.
values
();
if
(
CollectionUtils
.
isNotEmpty
(
entities
))
{
userInfoRepository
.
save
(
entities
);
}
return
req
;
//手机号是否存在--注册 登录
//微信是否存在- 若存在,和手机号是否匹配相同
//头像昵称
//用户存在--更新头像昵称 和微信信息
//用户不存在--
}
private
List
<
User
>
registerUser
(
List
<
String
>
phoneNoList
,
Map
<
String
,
User
>
phoneUserMap
,
Integer
tenantId
)
{
//查询已注册用户
List
<
User
>
registeredUserList
=
userRepository
.
findByPhoneNoInAndTenantId
(
phoneNoList
,
tenantId
);
registeredUserList
=
CollectionUtils
.
isEmpty
(
registeredUserList
)
?
Lists
.
newArrayList
()
:
registeredUserList
;
List
<
String
>
registeredPhoneList
=
registeredUserList
.
stream
().
map
(
e
->
e
.
getPhoneNo
()).
collect
(
Collectors
.
toList
());
//TODO 可能冻结,或者注销
//待注册
List
<
String
>
needRegisterPhoneList
=
phoneNoList
.
stream
().
filter
(
e
->
!
registeredPhoneList
.
contains
(
e
)).
collect
(
Collectors
.
toList
());
if
(
CollectionUtils
.
isNotEmpty
(
needRegisterPhoneList
))
{
List
<
User
>
pendRegisterUserList
=
Lists
.
newArrayList
();
for
(
String
phone
:
needRegisterPhoneList
)
{
//TODO 可能会存在已经注销的,又洗进来了
String
uuid
=
UUID
.
randomUUID
().
toString
();
User
user
=
phoneUserMap
.
get
(
phone
);
user
.
setEncryptedPhoneNo
(
phone
);
user
.
setEnable
(
true
);
user
.
setTenantId
(
tenantId
);
user
.
setUuid
(
uuid
);
//清洗数据,忽略密码
user
.
setPassword
(
null
);
user
.
setCipherPassword
(
null
);
pendRegisterUserList
.
add
(
user
);
}
List
<
User
>
saveList
=
userRepository
.
save
(
pendRegisterUserList
);
registeredUserList
.
addAll
(
saveList
);
}
return
registeredUserList
;
}
}
src/main/java/cn/quantgroup/xyqb/service/v2/WechatMiniLoginStrategy.java
View file @
538c2d77
...
...
@@ -91,6 +91,11 @@ public class WechatMiniLoginStrategy implements LoginStrategy {
//2、登录判断逻辑
WechatUserInfo
wechatUserInfo
=
weChatUserRepository
.
findByOpenIdAndAppIdAndTenantId
(
openid
,
loginParam
.
getAppId
(),
sessionStruct
.
getTenantId
());
//未绑定userid,禁止登录
if
(
wechatUserInfo
==
null
||
wechatUserInfo
.
getUserId
()
==
null
)
{
throw
new
BizException
(
BizExceptionEnum
.
ERROR_WECHAT_BIND_USERID
);
}
boolean
register
=
false
;
if
(
wechatUserInfo
==
null
)
{
//首次登录
...
...
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