mirror of
https://gitee.com/huangge1199_admin/vue-pro.git
synced 2025-01-18 19:20:05 +08:00
✨ Member:增加获取单个社交用户的接口
This commit is contained in:
parent
59752d43b7
commit
7b482f5729
@ -2,11 +2,16 @@ package cn.iocoder.yudao.module.member.controller.app.social;
|
|||||||
|
|
||||||
import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
|
import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||||
|
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||||
import cn.iocoder.yudao.framework.security.core.annotations.PreAuthenticated;
|
import cn.iocoder.yudao.framework.security.core.annotations.PreAuthenticated;
|
||||||
import cn.iocoder.yudao.module.member.controller.app.social.vo.AppSocialUserBindReqVO;
|
import cn.iocoder.yudao.module.member.controller.app.social.vo.AppSocialUserBindReqVO;
|
||||||
|
import cn.iocoder.yudao.module.member.controller.app.social.vo.AppSocialUserRespVO;
|
||||||
import cn.iocoder.yudao.module.member.controller.app.social.vo.AppSocialUserUnbindReqVO;
|
import cn.iocoder.yudao.module.member.controller.app.social.vo.AppSocialUserUnbindReqVO;
|
||||||
import cn.iocoder.yudao.module.member.convert.social.SocialUserConvert;
|
|
||||||
import cn.iocoder.yudao.module.system.api.social.SocialUserApi;
|
import cn.iocoder.yudao.module.system.api.social.SocialUserApi;
|
||||||
|
import cn.iocoder.yudao.module.system.api.social.dto.SocialUserBindReqDTO;
|
||||||
|
import cn.iocoder.yudao.module.system.api.social.dto.SocialUserRespDTO;
|
||||||
|
import cn.iocoder.yudao.module.system.api.social.dto.SocialUserUnbindReqDTO;
|
||||||
|
import io.swagger.v3.oas.annotations.Parameter;
|
||||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
import io.swagger.v3.oas.annotations.Operation;
|
import io.swagger.v3.oas.annotations.Operation;
|
||||||
import org.springframework.validation.annotation.Validated;
|
import org.springframework.validation.annotation.Validated;
|
||||||
@ -15,11 +20,12 @@ import org.springframework.web.bind.annotation.*;
|
|||||||
import jakarta.annotation.Resource;
|
import jakarta.annotation.Resource;
|
||||||
import jakarta.validation.Valid;
|
import jakarta.validation.Valid;
|
||||||
|
|
||||||
|
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
||||||
import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
|
import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
|
||||||
|
|
||||||
@Tag(name = "用户 App - 社交用户")
|
@Tag(name = "用户 App - 社交用户")
|
||||||
@RestController
|
@RestController
|
||||||
@RequestMapping("/system/social-user")
|
@RequestMapping("/member/social-user")
|
||||||
@Validated
|
@Validated
|
||||||
public class AppSocialUserController {
|
public class AppSocialUserController {
|
||||||
|
|
||||||
@ -29,16 +35,29 @@ public class AppSocialUserController {
|
|||||||
@PostMapping("/bind")
|
@PostMapping("/bind")
|
||||||
@Operation(summary = "社交绑定,使用 code 授权码")
|
@Operation(summary = "社交绑定,使用 code 授权码")
|
||||||
public CommonResult<Boolean> socialBind(@RequestBody @Valid AppSocialUserBindReqVO reqVO) {
|
public CommonResult<Boolean> socialBind(@RequestBody @Valid AppSocialUserBindReqVO reqVO) {
|
||||||
socialUserApi.bindSocialUser(SocialUserConvert.INSTANCE.convert(getLoginUserId(), UserTypeEnum.MEMBER.getValue(), reqVO));
|
SocialUserBindReqDTO reqDTO = new SocialUserBindReqDTO(getLoginUserId(), UserTypeEnum.MEMBER.getValue(),
|
||||||
return CommonResult.success(true);
|
reqVO.getType(), reqVO.getCode(), reqVO.getState());
|
||||||
|
socialUserApi.bindSocialUser(reqDTO);
|
||||||
|
return success(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@DeleteMapping("/unbind")
|
@DeleteMapping("/unbind")
|
||||||
@Operation(summary = "取消社交绑定")
|
@Operation(summary = "取消社交绑定")
|
||||||
@PreAuthenticated
|
@PreAuthenticated
|
||||||
public CommonResult<Boolean> socialUnbind(@RequestBody AppSocialUserUnbindReqVO reqVO) {
|
public CommonResult<Boolean> socialUnbind(@RequestBody AppSocialUserUnbindReqVO reqVO) {
|
||||||
socialUserApi.unbindSocialUser(SocialUserConvert.INSTANCE.convert(getLoginUserId(), UserTypeEnum.MEMBER.getValue(), reqVO));
|
SocialUserUnbindReqDTO reqDTO = new SocialUserUnbindReqDTO(getLoginUserId(), UserTypeEnum.MEMBER.getValue(),
|
||||||
return CommonResult.success(true);
|
reqVO.getType(), reqVO.getOpenid());
|
||||||
|
socialUserApi.unbindSocialUser(reqDTO);
|
||||||
|
return success(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping("/get")
|
||||||
|
@Operation(summary = "获得社交用户")
|
||||||
|
@Parameter(name = "type", description = "社交平台的类型,参见 SocialTypeEnum 枚举值", required = true, example = "10")
|
||||||
|
@PreAuthenticated
|
||||||
|
public CommonResult<AppSocialUserRespVO> getSocialUser(@RequestParam("type") Integer type) {
|
||||||
|
SocialUserRespDTO socialUser = socialUserApi.getSocialUserByUserId(UserTypeEnum.MEMBER.getValue(), getLoginUserId(), type);
|
||||||
|
return success(BeanUtils.toBean(socialUser, AppSocialUserRespVO.class));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -13,9 +13,6 @@ import jakarta.validation.constraints.NotNull;
|
|||||||
|
|
||||||
@Schema(description = "用户 APP - 社交绑定 Request VO,使用 code 授权码")
|
@Schema(description = "用户 APP - 社交绑定 Request VO,使用 code 授权码")
|
||||||
@Data
|
@Data
|
||||||
@NoArgsConstructor
|
|
||||||
@AllArgsConstructor
|
|
||||||
@Builder
|
|
||||||
public class AppSocialUserBindReqVO {
|
public class AppSocialUserBindReqVO {
|
||||||
|
|
||||||
@Schema(description = "社交平台的类型,参见 SocialTypeEnum 枚举值", requiredMode = Schema.RequiredMode.REQUIRED, example = "10")
|
@Schema(description = "社交平台的类型,参见 SocialTypeEnum 枚举值", requiredMode = Schema.RequiredMode.REQUIRED, example = "10")
|
||||||
|
@ -0,0 +1,19 @@
|
|||||||
|
package cn.iocoder.yudao.module.member.controller.app.social.vo;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@Schema(description = "用户 APP - 社交用户 Response VO")
|
||||||
|
@Data
|
||||||
|
public class AppSocialUserRespVO {
|
||||||
|
|
||||||
|
@Schema(description = "社交用户的 openid", requiredMode = Schema.RequiredMode.REQUIRED, example = "IPRmJ0wvBptiPIlGEZiPewGwiEiE")
|
||||||
|
private String openid;
|
||||||
|
|
||||||
|
@Schema(description = "社交用户的昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道源码")
|
||||||
|
private String nickname;
|
||||||
|
|
||||||
|
@Schema(description = "社交用户的头像", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn/1.png")
|
||||||
|
private String avatar;
|
||||||
|
|
||||||
|
}
|
@ -13,9 +13,6 @@ import jakarta.validation.constraints.NotNull;
|
|||||||
|
|
||||||
@Schema(description = "用户 APP - 取消社交绑定 Request VO")
|
@Schema(description = "用户 APP - 取消社交绑定 Request VO")
|
||||||
@Data
|
@Data
|
||||||
@NoArgsConstructor
|
|
||||||
@AllArgsConstructor
|
|
||||||
@Builder
|
|
||||||
public class AppSocialUserUnbindReqVO {
|
public class AppSocialUserUnbindReqVO {
|
||||||
|
|
||||||
@Schema(description = "社交平台的类型,参见 SocialTypeEnum 枚举值", requiredMode = Schema.RequiredMode.REQUIRED, example = "10")
|
@Schema(description = "社交平台的类型,参见 SocialTypeEnum 枚举值", requiredMode = Schema.RequiredMode.REQUIRED, example = "10")
|
||||||
|
@ -1,19 +0,0 @@
|
|||||||
package cn.iocoder.yudao.module.member.convert.social;
|
|
||||||
|
|
||||||
import cn.iocoder.yudao.module.member.controller.app.social.vo.AppSocialUserBindReqVO;
|
|
||||||
import cn.iocoder.yudao.module.member.controller.app.social.vo.AppSocialUserUnbindReqVO;
|
|
||||||
import cn.iocoder.yudao.module.system.api.social.dto.SocialUserBindReqDTO;
|
|
||||||
import cn.iocoder.yudao.module.system.api.social.dto.SocialUserUnbindReqDTO;
|
|
||||||
import org.mapstruct.Mapper;
|
|
||||||
import org.mapstruct.factory.Mappers;
|
|
||||||
|
|
||||||
@Mapper
|
|
||||||
public interface SocialUserConvert {
|
|
||||||
|
|
||||||
SocialUserConvert INSTANCE = Mappers.getMapper(SocialUserConvert.class);
|
|
||||||
|
|
||||||
SocialUserBindReqDTO convert(Long userId, Integer userType, AppSocialUserBindReqVO reqVO);
|
|
||||||
|
|
||||||
SocialUserUnbindReqDTO convert(Long userId, Integer userType, AppSocialUserUnbindReqVO reqVO);
|
|
||||||
|
|
||||||
}
|
|
@ -103,7 +103,7 @@ public class MemberAuthServiceImpl implements MemberAuthService {
|
|||||||
@Transactional
|
@Transactional
|
||||||
public AppAuthLoginRespVO socialLogin(AppAuthSocialLoginReqVO reqVO) {
|
public AppAuthLoginRespVO socialLogin(AppAuthSocialLoginReqVO reqVO) {
|
||||||
// 使用 code 授权码,进行登录。然后,获得到绑定的用户编号
|
// 使用 code 授权码,进行登录。然后,获得到绑定的用户编号
|
||||||
SocialUserRespDTO socialUser = socialUserApi.getSocialUser(UserTypeEnum.MEMBER.getValue(), reqVO.getType(),
|
SocialUserRespDTO socialUser = socialUserApi.getSocialUserByCode(UserTypeEnum.MEMBER.getValue(), reqVO.getType(),
|
||||||
reqVO.getCode(), reqVO.getState());
|
reqVO.getCode(), reqVO.getState());
|
||||||
if (socialUser == null) {
|
if (socialUser == null) {
|
||||||
throw exception(AUTH_SOCIAL_USER_NOT_FOUND);
|
throw exception(AUTH_SOCIAL_USER_NOT_FOUND);
|
||||||
|
@ -29,6 +29,16 @@ public interface SocialUserApi {
|
|||||||
*/
|
*/
|
||||||
void unbindSocialUser(@Valid SocialUserUnbindReqDTO reqDTO);
|
void unbindSocialUser(@Valid SocialUserUnbindReqDTO reqDTO);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获得社交用户,基于 userId
|
||||||
|
*
|
||||||
|
* @param userType 用户类型
|
||||||
|
* @param userId 用户编号
|
||||||
|
* @param socialType 社交平台的类型
|
||||||
|
* @return 社交用户
|
||||||
|
*/
|
||||||
|
SocialUserRespDTO getSocialUserByUserId(Integer userType, Long userId, Integer socialType);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获得社交用户
|
* 获得社交用户
|
||||||
*
|
*
|
||||||
@ -40,7 +50,6 @@ public interface SocialUserApi {
|
|||||||
* @param state state
|
* @param state state
|
||||||
* @return 社交用户
|
* @return 社交用户
|
||||||
*/
|
*/
|
||||||
SocialUserRespDTO getSocialUser(Integer userType, Integer socialType,
|
SocialUserRespDTO getSocialUserByCode(Integer userType, Integer socialType, String code, String state);
|
||||||
String code, String state);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -3,10 +3,12 @@ package cn.iocoder.yudao.module.system.api.social.dto;
|
|||||||
import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
|
import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
|
||||||
import cn.iocoder.yudao.framework.common.validation.InEnum;
|
import cn.iocoder.yudao.framework.common.validation.InEnum;
|
||||||
import cn.iocoder.yudao.module.system.enums.social.SocialTypeEnum;
|
import cn.iocoder.yudao.module.system.enums.social.SocialTypeEnum;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
import jakarta.validation.constraints.NotEmpty;
|
import jakarta.validation.constraints.NotEmpty;
|
||||||
import jakarta.validation.constraints.NotNull;
|
import jakarta.validation.constraints.NotNull;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 社交绑定 Request DTO,使用 code 授权码
|
* 社交绑定 Request DTO,使用 code 授权码
|
||||||
@ -14,6 +16,8 @@ import jakarta.validation.constraints.NotNull;
|
|||||||
* @author 芋道源码
|
* @author 芋道源码
|
||||||
*/
|
*/
|
||||||
@Data
|
@Data
|
||||||
|
@AllArgsConstructor
|
||||||
|
@NoArgsConstructor
|
||||||
public class SocialUserUnbindReqDTO {
|
public class SocialUserUnbindReqDTO {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -33,8 +33,13 @@ public class SocialUserApiImpl implements SocialUserApi {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public SocialUserRespDTO getSocialUser(Integer userType, Integer socialType, String code, String state) {
|
public SocialUserRespDTO getSocialUserByUserId(Integer userType, Long userId, Integer socialType) {
|
||||||
return socialUserService.getSocialUser(userType, socialType, code, state);
|
return socialUserService.getSocialUserByUserId(userType, userId, socialType);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SocialUserRespDTO getSocialUserByCode(Integer userType, Integer socialType, String code, String state) {
|
||||||
|
return socialUserService.getSocialUserByCode(userType, socialType, code, state);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -34,4 +34,11 @@ public interface SocialUserBindMapper extends BaseMapperX<SocialUserBindDO> {
|
|||||||
.eq(SocialUserBindDO::getUserType, userType));
|
.eq(SocialUserBindDO::getUserType, userType));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
default SocialUserBindDO selectByUserIdAndUserTypeAndSocialType(Long userId, Integer userType, Integer socialType) {
|
||||||
|
return selectOne(new LambdaQueryWrapperX<SocialUserBindDO>()
|
||||||
|
.eq(SocialUserBindDO::getUserId, userId)
|
||||||
|
.eq(SocialUserBindDO::getUserType, userType)
|
||||||
|
.eq(SocialUserBindDO::getSocialType, socialType));
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -156,7 +156,7 @@ public class AdminAuthServiceImpl implements AdminAuthService {
|
|||||||
@Override
|
@Override
|
||||||
public AuthLoginRespVO socialLogin(AuthSocialLoginReqVO reqVO) {
|
public AuthLoginRespVO socialLogin(AuthSocialLoginReqVO reqVO) {
|
||||||
// 使用 code 授权码,进行登录。然后,获得到绑定的用户编号
|
// 使用 code 授权码,进行登录。然后,获得到绑定的用户编号
|
||||||
SocialUserRespDTO socialUser = socialUserService.getSocialUser(UserTypeEnum.ADMIN.getValue(), reqVO.getType(),
|
SocialUserRespDTO socialUser = socialUserService.getSocialUserByCode(UserTypeEnum.ADMIN.getValue(), reqVO.getType(),
|
||||||
reqVO.getCode(), reqVO.getState());
|
reqVO.getCode(), reqVO.getState());
|
||||||
if (socialUser == null || socialUser.getUserId() == null) {
|
if (socialUser == null || socialUser.getUserId() == null) {
|
||||||
throw exception(AUTH_THIRD_LOGIN_NOT_BIND);
|
throw exception(AUTH_THIRD_LOGIN_NOT_BIND);
|
||||||
|
@ -45,6 +45,16 @@ public interface SocialUserService {
|
|||||||
*/
|
*/
|
||||||
void unbindSocialUser(Long userId, Integer userType, Integer socialType, String openid);
|
void unbindSocialUser(Long userId, Integer userType, Integer socialType, String openid);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获得社交用户,基于 userId
|
||||||
|
*
|
||||||
|
* @param userType 用户类型
|
||||||
|
* @param userId 用户编号
|
||||||
|
* @param socialType 社交平台的类型
|
||||||
|
* @return 社交用户
|
||||||
|
*/
|
||||||
|
SocialUserRespDTO getSocialUserByUserId(Integer userType, Long userId, Integer socialType);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获得社交用户
|
* 获得社交用户
|
||||||
*
|
*
|
||||||
@ -56,7 +66,7 @@ public interface SocialUserService {
|
|||||||
* @param state state
|
* @param state state
|
||||||
* @return 社交用户
|
* @return 社交用户
|
||||||
*/
|
*/
|
||||||
SocialUserRespDTO getSocialUser(Integer userType, Integer socialType, String code, String state);
|
SocialUserRespDTO getSocialUserByCode(Integer userType, Integer socialType, String code, String state);
|
||||||
|
|
||||||
// ==================== 社交用户 CRUD ====================
|
// ==================== 社交用户 CRUD ====================
|
||||||
|
|
||||||
|
@ -26,7 +26,6 @@ import java.util.List;
|
|||||||
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
||||||
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
|
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
|
||||||
import static cn.iocoder.yudao.framework.common.util.json.JsonUtils.toJsonString;
|
import static cn.iocoder.yudao.framework.common.util.json.JsonUtils.toJsonString;
|
||||||
import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.AUTH_THIRD_LOGIN_NOT_BIND;
|
|
||||||
import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.SOCIAL_USER_NOT_FOUND;
|
import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.SOCIAL_USER_NOT_FOUND;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -94,7 +93,21 @@ public class SocialUserServiceImpl implements SocialUserService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public SocialUserRespDTO getSocialUser(Integer userType, Integer socialType, String code, String state) {
|
public SocialUserRespDTO getSocialUserByUserId(Integer userType, Long userId, Integer socialType) {
|
||||||
|
// 获得绑定用户
|
||||||
|
SocialUserBindDO socialUserBind = socialUserBindMapper.selectByUserIdAndUserTypeAndSocialType(userId, userType, socialType);
|
||||||
|
if (socialUserBind == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
// 获得社交用户
|
||||||
|
SocialUserDO socialUser = socialUserMapper.selectById(socialUserBind.getSocialUserId());
|
||||||
|
Assert.notNull(socialUser, "社交用户不能为空");
|
||||||
|
return new SocialUserRespDTO(socialUser.getOpenid(), socialUser.getNickname(), socialUser.getAvatar(),
|
||||||
|
socialUserBind.getUserId());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SocialUserRespDTO getSocialUserByCode(Integer userType, Integer socialType, String code, String state) {
|
||||||
// 获得社交用户
|
// 获得社交用户
|
||||||
SocialUserDO socialUser = authSocialUser(socialType, userType, code, state);
|
SocialUserDO socialUser = authSocialUser(socialType, userType, code, state);
|
||||||
Assert.notNull(socialUser, "社交用户不能为空");
|
Assert.notNull(socialUser, "社交用户不能为空");
|
||||||
|
@ -236,7 +236,7 @@ public class AdminAuthServiceImplTest extends BaseDbUnitTest {
|
|||||||
AuthSocialLoginReqVO reqVO = randomPojo(AuthSocialLoginReqVO.class);
|
AuthSocialLoginReqVO reqVO = randomPojo(AuthSocialLoginReqVO.class);
|
||||||
// mock 方法(绑定的用户编号)
|
// mock 方法(绑定的用户编号)
|
||||||
Long userId = 1L;
|
Long userId = 1L;
|
||||||
when(socialUserService.getSocialUser(eq(UserTypeEnum.ADMIN.getValue()), eq(reqVO.getType()),
|
when(socialUserService.getSocialUserByCode(eq(UserTypeEnum.ADMIN.getValue()), eq(reqVO.getType()),
|
||||||
eq(reqVO.getCode()), eq(reqVO.getState()))).thenReturn(new SocialUserRespDTO(randomString(), userId));
|
eq(reqVO.getCode()), eq(reqVO.getState()))).thenReturn(new SocialUserRespDTO(randomString(), userId));
|
||||||
// mock(用户)
|
// mock(用户)
|
||||||
AdminUserDO user = randomPojo(AdminUserDO.class, o -> o.setId(userId));
|
AdminUserDO user = randomPojo(AdminUserDO.class, o -> o.setId(userId));
|
||||||
|
@ -147,7 +147,7 @@ public class SocialUserServiceImplTest extends BaseDbUnitTest {
|
|||||||
socialUserBindMapper.insert(socialUserBind);
|
socialUserBindMapper.insert(socialUserBind);
|
||||||
|
|
||||||
// 调用
|
// 调用
|
||||||
SocialUserRespDTO socialUser = socialUserService.getSocialUser(userType, type, code, state);
|
SocialUserRespDTO socialUser = socialUserService.getSocialUserByCode(userType, type, code, state);
|
||||||
// 断言
|
// 断言
|
||||||
assertEquals(userId, socialUser.getUserId());
|
assertEquals(userId, socialUser.getUserId());
|
||||||
assertEquals(socialUserDO.getOpenid(), socialUser.getOpenid());
|
assertEquals(socialUserDO.getOpenid(), socialUser.getOpenid());
|
||||||
|
Loading…
Reference in New Issue
Block a user