Commit d65c28d7f7e7db4a8c14538ba3cd30d3111bf6d3
1 parent
106c1ecf
✨ Member:社交登录逻辑调整,如果登录时无用户,则自动创建用户,保持和各 App 统一逻辑
Showing
16 changed files
with
80 additions
and
38 deletions
yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/enums/TerminalEnum.java
| @@ -15,6 +15,7 @@ import java.util.Arrays; | @@ -15,6 +15,7 @@ import java.util.Arrays; | ||
| 15 | @Getter | 15 | @Getter |
| 16 | public enum TerminalEnum implements IntArrayValuable { | 16 | public enum TerminalEnum implements IntArrayValuable { |
| 17 | 17 | ||
| 18 | + UNKNOWN(0, "未知"), // 目的:在无法解析到 terminal 时,使用它 | ||
| 18 | WECHAT_MINI_PROGRAM(10, "微信小程序"), | 19 | WECHAT_MINI_PROGRAM(10, "微信小程序"), |
| 19 | WECHAT_WAP(11, "微信公众号"), | 20 | WECHAT_WAP(11, "微信公众号"), |
| 20 | H5(20, "H5 网页"), | 21 | H5(20, "H5 网页"), |
yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/servlet/ServletUtils.java
| @@ -88,8 +88,6 @@ public class ServletUtils { | @@ -88,8 +88,6 @@ public class ServletUtils { | ||
| 88 | return JakartaServletUtil.getClientIP(request); | 88 | return JakartaServletUtil.getClientIP(request); |
| 89 | } | 89 | } |
| 90 | 90 | ||
| 91 | - // TODO @疯狂:terminal 还是从 ServletUtils 里拿,更容易全局治理; | ||
| 92 | - | ||
| 93 | public static boolean isJsonRequest(ServletRequest request) { | 91 | public static boolean isJsonRequest(ServletRequest request) { |
| 94 | return StrUtil.startWithIgnoreCase(request.getContentType(), MediaType.APPLICATION_JSON_VALUE); | 92 | return StrUtil.startWithIgnoreCase(request.getContentType(), MediaType.APPLICATION_JSON_VALUE); |
| 95 | } | 93 | } |
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/core/util/WebFrameworkUtils.java
| 1 | package cn.iocoder.yudao.framework.web.core.util; | 1 | package cn.iocoder.yudao.framework.web.core.util; |
| 2 | 2 | ||
| 3 | import cn.hutool.core.util.NumberUtil; | 3 | import cn.hutool.core.util.NumberUtil; |
| 4 | +import cn.hutool.extra.servlet.ServletUtil; | ||
| 5 | +import cn.iocoder.yudao.framework.common.enums.TerminalEnum; | ||
| 4 | import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; | 6 | import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; |
| 5 | import cn.iocoder.yudao.framework.common.pojo.CommonResult; | 7 | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| 8 | +import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils; | ||
| 6 | import cn.iocoder.yudao.framework.web.config.WebProperties; | 9 | import cn.iocoder.yudao.framework.web.config.WebProperties; |
| 7 | import org.springframework.web.context.request.RequestAttributes; | 10 | import org.springframework.web.context.request.RequestAttributes; |
| 8 | import org.springframework.web.context.request.RequestContextHolder; | 11 | import org.springframework.web.context.request.RequestContextHolder; |
| @@ -25,6 +28,13 @@ public class WebFrameworkUtils { | @@ -25,6 +28,13 @@ public class WebFrameworkUtils { | ||
| 25 | 28 | ||
| 26 | public static final String HEADER_TENANT_ID = "tenant-id"; | 29 | public static final String HEADER_TENANT_ID = "tenant-id"; |
| 27 | 30 | ||
| 31 | + /** | ||
| 32 | + * 终端的 Header | ||
| 33 | + * | ||
| 34 | + * @see cn.iocoder.yudao.framework.common.enums.TerminalEnum | ||
| 35 | + */ | ||
| 36 | + public static final String HEADER_TERMINAL = "terminal"; | ||
| 37 | + | ||
| 28 | private static WebProperties properties; | 38 | private static WebProperties properties; |
| 29 | 39 | ||
| 30 | public WebFrameworkUtils(WebProperties webProperties) { | 40 | public WebFrameworkUtils(WebProperties webProperties) { |
| @@ -107,6 +117,15 @@ public class WebFrameworkUtils { | @@ -107,6 +117,15 @@ public class WebFrameworkUtils { | ||
| 107 | return getLoginUserId(request); | 117 | return getLoginUserId(request); |
| 108 | } | 118 | } |
| 109 | 119 | ||
| 120 | + public static Integer getTerminal() { | ||
| 121 | + HttpServletRequest request = getRequest(); | ||
| 122 | + if (request == null) { | ||
| 123 | + return TerminalEnum.UNKNOWN.getTerminal(); | ||
| 124 | + } | ||
| 125 | + String terminalValue = request.getHeader(HEADER_TERMINAL); | ||
| 126 | + return NumberUtil.parseInt(terminalValue, TerminalEnum.UNKNOWN.getTerminal()); | ||
| 127 | + } | ||
| 128 | + | ||
| 110 | public static void setCommonResult(ServletRequest request, CommonResult<?> result) { | 129 | public static void setCommonResult(ServletRequest request, CommonResult<?> result) { |
| 111 | request.setAttribute(REQUEST_ATTRIBUTE_COMMON_RESULT, result); | 130 | request.setAttribute(REQUEST_ATTRIBUTE_COMMON_RESULT, result); |
| 112 | } | 131 | } |
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/AppTradeOrderController.java
| @@ -61,9 +61,8 @@ public class AppTradeOrderController { | @@ -61,9 +61,8 @@ public class AppTradeOrderController { | ||
| 61 | @PostMapping("/create") | 61 | @PostMapping("/create") |
| 62 | @Operation(summary = "创建订单") | 62 | @Operation(summary = "创建订单") |
| 63 | @PreAuthenticated | 63 | @PreAuthenticated |
| 64 | - public CommonResult<AppTradeOrderCreateRespVO> createOrder(@Valid @RequestBody AppTradeOrderCreateReqVO createReqVO, | ||
| 65 | - @RequestHeader Integer terminal) { | ||
| 66 | - TradeOrderDO order = tradeOrderUpdateService.createOrder(getLoginUserId(), getClientIP(), createReqVO, terminal); | 64 | + public CommonResult<AppTradeOrderCreateRespVO> createOrder(@Valid @RequestBody AppTradeOrderCreateReqVO createReqVO) { |
| 65 | + TradeOrderDO order = tradeOrderUpdateService.createOrder(getLoginUserId(), createReqVO); | ||
| 67 | return success(new AppTradeOrderCreateRespVO().setId(order.getId()).setPayOrderId(order.getPayOrderId())); | 66 | return success(new AppTradeOrderCreateRespVO().setId(order.getId()).setPayOrderId(order.getPayOrderId())); |
| 68 | } | 67 | } |
| 69 | 68 |
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/convert/order/TradeOrderConvert.java
| @@ -69,8 +69,7 @@ public interface TradeOrderConvert { | @@ -69,8 +69,7 @@ public interface TradeOrderConvert { | ||
| 69 | @Mapping(source = "calculateRespBO.price.vipPrice", target = "vipPrice"), | 69 | @Mapping(source = "calculateRespBO.price.vipPrice", target = "vipPrice"), |
| 70 | @Mapping(source = "calculateRespBO.price.payPrice", target = "payPrice") | 70 | @Mapping(source = "calculateRespBO.price.payPrice", target = "payPrice") |
| 71 | }) | 71 | }) |
| 72 | - TradeOrderDO convert(Long userId, String userIp, AppTradeOrderCreateReqVO createReqVO, | ||
| 73 | - TradePriceCalculateRespBO calculateRespBO); | 72 | + TradeOrderDO convert(Long userId, AppTradeOrderCreateReqVO createReqVO, TradePriceCalculateRespBO calculateRespBO); |
| 74 | 73 | ||
| 75 | TradeOrderRespDTO convert(TradeOrderDO orderDO); | 74 | TradeOrderRespDTO convert(TradeOrderDO orderDO); |
| 76 | 75 |
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderUpdateService.java
| @@ -36,12 +36,10 @@ public interface TradeOrderUpdateService { | @@ -36,12 +36,10 @@ public interface TradeOrderUpdateService { | ||
| 36 | * 【会员】创建交易订单 | 36 | * 【会员】创建交易订单 |
| 37 | * | 37 | * |
| 38 | * @param userId 登录用户 | 38 | * @param userId 登录用户 |
| 39 | - * @param userIp 用户 IP 地址 | ||
| 40 | * @param createReqVO 创建交易订单请求模型 | 39 | * @param createReqVO 创建交易订单请求模型 |
| 41 | - * @param terminal 终端 {@link TerminalEnum} | ||
| 42 | * @return 交易订单的 | 40 | * @return 交易订单的 |
| 43 | */ | 41 | */ |
| 44 | - TradeOrderDO createOrder(Long userId, String userIp, AppTradeOrderCreateReqVO createReqVO, Integer terminal); | 42 | + TradeOrderDO createOrder(Long userId, AppTradeOrderCreateReqVO createReqVO); |
| 45 | 43 | ||
| 46 | /** | 44 | /** |
| 47 | * 更新交易订单已支付 | 45 | * 更新交易订单已支付 |
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderUpdateServiceImpl.java
| @@ -64,6 +64,8 @@ import java.util.Set; | @@ -64,6 +64,8 @@ import java.util.Set; | ||
| 64 | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; | 64 | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| 65 | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*; | 65 | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*; |
| 66 | import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.minusTime; | 66 | import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.minusTime; |
| 67 | +import static cn.iocoder.yudao.framework.common.util.servlet.ServletUtils.getClientIP; | ||
| 68 | +import static cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils.getTerminal; | ||
| 67 | import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.*; | 69 | import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.*; |
| 68 | 70 | ||
| 69 | /** | 71 | /** |
| @@ -158,11 +160,11 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { | @@ -158,11 +160,11 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { | ||
| 158 | @Override | 160 | @Override |
| 159 | @Transactional(rollbackFor = Exception.class) | 161 | @Transactional(rollbackFor = Exception.class) |
| 160 | @TradeOrderLog(operateType = TradeOrderOperateTypeEnum.MEMBER_CREATE) | 162 | @TradeOrderLog(operateType = TradeOrderOperateTypeEnum.MEMBER_CREATE) |
| 161 | - public TradeOrderDO createOrder(Long userId, String userIp, AppTradeOrderCreateReqVO createReqVO, Integer terminal) { | 163 | + public TradeOrderDO createOrder(Long userId, AppTradeOrderCreateReqVO createReqVO) { |
| 162 | // 1.1 价格计算 | 164 | // 1.1 价格计算 |
| 163 | TradePriceCalculateRespBO calculateRespBO = calculatePrice(userId, createReqVO); | 165 | TradePriceCalculateRespBO calculateRespBO = calculatePrice(userId, createReqVO); |
| 164 | // 1.2 构建订单 | 166 | // 1.2 构建订单 |
| 165 | - TradeOrderDO order = buildTradeOrder(userId, userIp, createReqVO, calculateRespBO, terminal); | 167 | + TradeOrderDO order = buildTradeOrder(userId, createReqVO, calculateRespBO); |
| 166 | List<TradeOrderItemDO> orderItems = buildTradeOrderItems(order, calculateRespBO); | 168 | List<TradeOrderItemDO> orderItems = buildTradeOrderItems(order, calculateRespBO); |
| 167 | 169 | ||
| 168 | // 2. 订单创建前的逻辑 | 170 | // 2. 订单创建前的逻辑 |
| @@ -178,15 +180,15 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { | @@ -178,15 +180,15 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { | ||
| 178 | return order; | 180 | return order; |
| 179 | } | 181 | } |
| 180 | 182 | ||
| 181 | - private TradeOrderDO buildTradeOrder(Long userId, String clientIp, AppTradeOrderCreateReqVO createReqVO, | ||
| 182 | - TradePriceCalculateRespBO calculateRespBO, Integer terminal) { | ||
| 183 | - TradeOrderDO order = TradeOrderConvert.INSTANCE.convert(userId, clientIp, createReqVO, calculateRespBO); | 183 | + private TradeOrderDO buildTradeOrder(Long userId, AppTradeOrderCreateReqVO createReqVO, |
| 184 | + TradePriceCalculateRespBO calculateRespBO) { | ||
| 185 | + TradeOrderDO order = TradeOrderConvert.INSTANCE.convert(userId, createReqVO, calculateRespBO); | ||
| 184 | order.setType(calculateRespBO.getType()); | 186 | order.setType(calculateRespBO.getType()); |
| 185 | order.setNo(tradeNoRedisDAO.generate(TradeNoRedisDAO.TRADE_ORDER_NO_PREFIX)); | 187 | order.setNo(tradeNoRedisDAO.generate(TradeNoRedisDAO.TRADE_ORDER_NO_PREFIX)); |
| 186 | order.setStatus(TradeOrderStatusEnum.UNPAID.getStatus()); | 188 | order.setStatus(TradeOrderStatusEnum.UNPAID.getStatus()); |
| 187 | order.setRefundStatus(TradeOrderRefundStatusEnum.NONE.getStatus()); | 189 | order.setRefundStatus(TradeOrderRefundStatusEnum.NONE.getStatus()); |
| 188 | order.setProductCount(getSumValue(calculateRespBO.getItems(), TradePriceCalculateRespBO.OrderItem::getCount, Integer::sum)); | 190 | order.setProductCount(getSumValue(calculateRespBO.getItems(), TradePriceCalculateRespBO.OrderItem::getCount, Integer::sum)); |
| 189 | - order.setTerminal(terminal); | 191 | + order.setUserIp(getClientIP()).setTerminal(getTerminal()); |
| 190 | // 支付 + 退款信息 | 192 | // 支付 + 退款信息 |
| 191 | order.setAdjustPrice(0).setPayStatus(false); | 193 | order.setAdjustPrice(0).setPayStatus(false); |
| 192 | order.setRefundStatus(TradeOrderRefundStatusEnum.NONE.getStatus()).setRefundPrice(0); | 194 | order.setRefundStatus(TradeOrderRefundStatusEnum.NONE.getStatus()).setRefundPrice(0); |
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/AppAuthController.java
| @@ -73,9 +73,8 @@ public class AppAuthController { | @@ -73,9 +73,8 @@ public class AppAuthController { | ||
| 73 | 73 | ||
| 74 | @PostMapping("/sms-login") | 74 | @PostMapping("/sms-login") |
| 75 | @Operation(summary = "使用手机 + 验证码登录") | 75 | @Operation(summary = "使用手机 + 验证码登录") |
| 76 | - public CommonResult<AppAuthLoginRespVO> smsLogin(@RequestBody @Valid AppAuthSmsLoginReqVO reqVO, | ||
| 77 | - @RequestHeader Integer terminal) { | ||
| 78 | - return success(authService.smsLogin(reqVO, terminal)); | 76 | + public CommonResult<AppAuthLoginRespVO> smsLogin(@RequestBody @Valid AppAuthSmsLoginReqVO reqVO) { |
| 77 | + return success(authService.smsLogin(reqVO)); | ||
| 79 | } | 78 | } |
| 80 | 79 | ||
| 81 | @PostMapping("/send-sms-code") | 80 | @PostMapping("/send-sms-code") |
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/auth/MemberAuthService.java
| 1 | package cn.iocoder.yudao.module.member.service.auth; | 1 | package cn.iocoder.yudao.module.member.service.auth; |
| 2 | 2 | ||
| 3 | -import cn.iocoder.yudao.framework.common.enums.TerminalEnum; | ||
| 4 | import cn.iocoder.yudao.module.member.controller.app.auth.vo.*; | 3 | import cn.iocoder.yudao.module.member.controller.app.auth.vo.*; |
| 5 | 4 | ||
| 6 | import jakarta.validation.Valid; | 5 | import jakarta.validation.Valid; |
| @@ -33,10 +32,9 @@ public interface MemberAuthService { | @@ -33,10 +32,9 @@ public interface MemberAuthService { | ||
| 33 | * 手机 + 验证码登陆 | 32 | * 手机 + 验证码登陆 |
| 34 | * | 33 | * |
| 35 | * @param reqVO 登陆信息 | 34 | * @param reqVO 登陆信息 |
| 36 | - * @param terminal 终端 {@link TerminalEnum} | ||
| 37 | * @return 登录结果 | 35 | * @return 登录结果 |
| 38 | */ | 36 | */ |
| 39 | - AppAuthLoginRespVO smsLogin(@Valid AppAuthSmsLoginReqVO reqVO, Integer terminal); | 37 | + AppAuthLoginRespVO smsLogin(@Valid AppAuthSmsLoginReqVO reqVO); |
| 40 | 38 | ||
| 41 | /** | 39 | /** |
| 42 | * 社交登录,使用 code 授权码 | 40 | * 社交登录,使用 code 授权码 |
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/auth/MemberAuthServiceImpl.java
| @@ -36,6 +36,7 @@ import java.util.Objects; | @@ -36,6 +36,7 @@ import java.util.Objects; | ||
| 36 | 36 | ||
| 37 | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; | 37 | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| 38 | import static cn.iocoder.yudao.framework.common.util.servlet.ServletUtils.getClientIP; | 38 | import static cn.iocoder.yudao.framework.common.util.servlet.ServletUtils.getClientIP; |
| 39 | +import static cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils.getTerminal; | ||
| 39 | import static cn.iocoder.yudao.module.member.enums.ErrorCodeConstants.*; | 40 | import static cn.iocoder.yudao.module.member.enums.ErrorCodeConstants.*; |
| 40 | 41 | ||
| 41 | /** | 42 | /** |
| @@ -78,13 +79,13 @@ public class MemberAuthServiceImpl implements MemberAuthService { | @@ -78,13 +79,13 @@ public class MemberAuthServiceImpl implements MemberAuthService { | ||
| 78 | 79 | ||
| 79 | @Override | 80 | @Override |
| 80 | @Transactional | 81 | @Transactional |
| 81 | - public AppAuthLoginRespVO smsLogin(AppAuthSmsLoginReqVO reqVO, Integer terminal) { | 82 | + public AppAuthLoginRespVO smsLogin(AppAuthSmsLoginReqVO reqVO) { |
| 82 | // 校验验证码 | 83 | // 校验验证码 |
| 83 | String userIp = getClientIP(); | 84 | String userIp = getClientIP(); |
| 84 | smsCodeApi.useSmsCode(AuthConvert.INSTANCE.convert(reqVO, SmsSceneEnum.MEMBER_LOGIN.getScene(), userIp)); | 85 | smsCodeApi.useSmsCode(AuthConvert.INSTANCE.convert(reqVO, SmsSceneEnum.MEMBER_LOGIN.getScene(), userIp)); |
| 85 | 86 | ||
| 86 | // 获得获得注册用户 | 87 | // 获得获得注册用户 |
| 87 | - MemberUserDO user = userService.createUserIfAbsent(reqVO.getMobile(), userIp, terminal); | 88 | + MemberUserDO user = userService.createUserIfAbsent(reqVO.getMobile(), userIp, getTerminal()); |
| 88 | Assert.notNull(user, "获取用户失败,结果为空"); | 89 | Assert.notNull(user, "获取用户失败,结果为空"); |
| 89 | 90 | ||
| 90 | // 如果 socialType 非空,说明需要绑定社交用户 | 91 | // 如果 socialType 非空,说明需要绑定社交用户 |
| @@ -107,10 +108,13 @@ public class MemberAuthServiceImpl implements MemberAuthService { | @@ -107,10 +108,13 @@ public class MemberAuthServiceImpl implements MemberAuthService { | ||
| 107 | throw exception(AUTH_THIRD_LOGIN_NOT_BIND); | 108 | throw exception(AUTH_THIRD_LOGIN_NOT_BIND); |
| 108 | } | 109 | } |
| 109 | 110 | ||
| 110 | - // 自动登录 | 111 | + // 情况一:已绑定,自动登录 |
| 111 | MemberUserDO user = userService.getUser(socialUser.getUserId()); | 112 | MemberUserDO user = userService.getUser(socialUser.getUserId()); |
| 112 | if (user == null) { | 113 | if (user == null) { |
| 113 | throw exception(USER_NOT_EXISTS); | 114 | throw exception(USER_NOT_EXISTS); |
| 115 | + // 情况二:未绑定,注册登录 | ||
| 116 | + } else { | ||
| 117 | + user = userService.createUser(user.getNickname(), user.getAvatar(), getClientIP(), getTerminal()); | ||
| 114 | } | 118 | } |
| 115 | 119 | ||
| 116 | // 创建 Token 令牌,记录登录日志 | 120 | // 创建 Token 令牌,记录登录日志 |
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/user/MemberUserService.java
| @@ -50,6 +50,18 @@ public interface MemberUserService { | @@ -50,6 +50,18 @@ public interface MemberUserService { | ||
| 50 | MemberUserDO createUserIfAbsent(@Mobile String mobile, String registerIp, Integer terminal); | 50 | MemberUserDO createUserIfAbsent(@Mobile String mobile, String registerIp, Integer terminal); |
| 51 | 51 | ||
| 52 | /** | 52 | /** |
| 53 | + * 创建用户 | ||
| 54 | + * 目的:三方登录时,如果未绑定用户时,自动创建对应用户 | ||
| 55 | + * | ||
| 56 | + * @param nickname 昵称 | ||
| 57 | + * @param avtar 头像 | ||
| 58 | + * @param registerIp 注册 IP | ||
| 59 | + * @param terminal 终端 {@link TerminalEnum} | ||
| 60 | + * @return 用户对象 | ||
| 61 | + */ | ||
| 62 | + MemberUserDO createUser(String nickname, String avtar, String registerIp, Integer terminal); | ||
| 63 | + | ||
| 64 | + /** | ||
| 53 | * 更新用户的最后登陆信息 | 65 | * 更新用户的最后登陆信息 |
| 54 | * | 66 | * |
| 55 | * @param id 用户编号 | 67 | * @param id 用户编号 |
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/user/MemberUserServiceImpl.java
| @@ -81,10 +81,17 @@ public class MemberUserServiceImpl implements MemberUserService { | @@ -81,10 +81,17 @@ public class MemberUserServiceImpl implements MemberUserService { | ||
| 81 | return user; | 81 | return user; |
| 82 | } | 82 | } |
| 83 | // 用户不存在,则进行创建 | 83 | // 用户不存在,则进行创建 |
| 84 | - return createUser(mobile, registerIp, terminal); | 84 | + return createUser(mobile, null, null, registerIp, terminal); |
| 85 | } | 85 | } |
| 86 | 86 | ||
| 87 | - private MemberUserDO createUser(String mobile, String registerIp, Integer terminal) { | 87 | + @Override |
| 88 | + @Transactional(rollbackFor = Exception.class) | ||
| 89 | + public MemberUserDO createUser(String nickname, String avtar, String registerIp, Integer terminal) { | ||
| 90 | + return createUser(null, nickname, avtar, registerIp, terminal); | ||
| 91 | + } | ||
| 92 | + | ||
| 93 | + private MemberUserDO createUser(String mobile, String nickname, String avtar, | ||
| 94 | + String registerIp, Integer terminal) { | ||
| 88 | // 生成密码 | 95 | // 生成密码 |
| 89 | String password = IdUtil.fastSimpleUUID(); | 96 | String password = IdUtil.fastSimpleUUID(); |
| 90 | // 插入用户 | 97 | // 插入用户 |
| @@ -92,8 +99,8 @@ public class MemberUserServiceImpl implements MemberUserService { | @@ -92,8 +99,8 @@ public class MemberUserServiceImpl implements MemberUserService { | ||
| 92 | user.setMobile(mobile); | 99 | user.setMobile(mobile); |
| 93 | user.setStatus(CommonStatusEnum.ENABLE.getStatus()); // 默认开启 | 100 | user.setStatus(CommonStatusEnum.ENABLE.getStatus()); // 默认开启 |
| 94 | user.setPassword(encodePassword(password)); // 加密密码 | 101 | user.setPassword(encodePassword(password)); // 加密密码 |
| 95 | - user.setRegisterIp(registerIp); | ||
| 96 | - user.setRegisterTerminal(terminal); | 102 | + user.setRegisterIp(registerIp).setRegisterTerminal(terminal); |
| 103 | + user.setNickname(nickname).setAvatar(avtar); // 基础信息 | ||
| 97 | memberUserMapper.insert(user); | 104 | memberUserMapper.insert(user); |
| 98 | 105 | ||
| 99 | // 发送 MQ 消息:用户创建 | 106 | // 发送 MQ 消息:用户创建 |
yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/logger/dto/LoginLogCreateReqDTO.java
| @@ -36,9 +36,9 @@ public class LoginLogCreateReqDTO { | @@ -36,9 +36,9 @@ public class LoginLogCreateReqDTO { | ||
| 36 | private Integer userType; | 36 | private Integer userType; |
| 37 | /** | 37 | /** |
| 38 | * 用户账号 | 38 | * 用户账号 |
| 39 | + * | ||
| 40 | + * 不再强制校验 username 非空,因为 Member 社交登录时,此时暂时没有 username(mobile)! | ||
| 39 | */ | 41 | */ |
| 40 | - @NotBlank(message = "用户账号不能为空") | ||
| 41 | - @Size(max = 30, message = "用户账号长度不能超过30个字符") | ||
| 42 | private String username; | 42 | private String username; |
| 43 | 43 | ||
| 44 | /** | 44 | /** |
yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/dto/SocialUserRespDTO.java
| @@ -15,9 +15,17 @@ import lombok.NoArgsConstructor; | @@ -15,9 +15,17 @@ import lombok.NoArgsConstructor; | ||
| 15 | public class SocialUserRespDTO { | 15 | public class SocialUserRespDTO { |
| 16 | 16 | ||
| 17 | /** | 17 | /** |
| 18 | - * 社交用户 openid | 18 | + * 社交用户的 openid |
| 19 | */ | 19 | */ |
| 20 | private String openid; | 20 | private String openid; |
| 21 | + /** | ||
| 22 | + * 社交用户的昵称 | ||
| 23 | + */ | ||
| 24 | + private String nickname; | ||
| 25 | + /** | ||
| 26 | + * 社交用户的头像 | ||
| 27 | + */ | ||
| 28 | + private String avatar; | ||
| 21 | 29 | ||
| 22 | /** | 30 | /** |
| 23 | * 关联的用户编号 | 31 | * 关联的用户编号 |
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthServiceImpl.java
| @@ -158,7 +158,7 @@ public class AdminAuthServiceImpl implements AdminAuthService { | @@ -158,7 +158,7 @@ public class AdminAuthServiceImpl implements AdminAuthService { | ||
| 158 | // 使用 code 授权码,进行登录。然后,获得到绑定的用户编号 | 158 | // 使用 code 授权码,进行登录。然后,获得到绑定的用户编号 |
| 159 | SocialUserRespDTO socialUser = socialUserService.getSocialUser(UserTypeEnum.ADMIN.getValue(), reqVO.getType(), | 159 | SocialUserRespDTO socialUser = socialUserService.getSocialUser(UserTypeEnum.ADMIN.getValue(), reqVO.getType(), |
| 160 | reqVO.getCode(), reqVO.getState()); | 160 | reqVO.getCode(), reqVO.getState()); |
| 161 | - if (socialUser == null) { | 161 | + if (socialUser == null || socialUser.getUserId() == null) { |
| 162 | throw exception(AUTH_THIRD_LOGIN_NOT_BIND); | 162 | throw exception(AUTH_THIRD_LOGIN_NOT_BIND); |
| 163 | } | 163 | } |
| 164 | 164 |
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialUserServiceImpl.java
| @@ -99,13 +99,11 @@ public class SocialUserServiceImpl implements SocialUserService { | @@ -99,13 +99,11 @@ public class SocialUserServiceImpl implements SocialUserService { | ||
| 99 | SocialUserDO socialUser = authSocialUser(socialType, userType, code, state); | 99 | SocialUserDO socialUser = authSocialUser(socialType, userType, code, state); |
| 100 | Assert.notNull(socialUser, "社交用户不能为空"); | 100 | Assert.notNull(socialUser, "社交用户不能为空"); |
| 101 | 101 | ||
| 102 | - // 如果未绑定的社交用户,则无法自动登录,进行报错 | 102 | + // 获得绑定用户 |
| 103 | SocialUserBindDO socialUserBind = socialUserBindMapper.selectByUserTypeAndSocialUserId(userType, | 103 | SocialUserBindDO socialUserBind = socialUserBindMapper.selectByUserTypeAndSocialUserId(userType, |
| 104 | socialUser.getId()); | 104 | socialUser.getId()); |
| 105 | - if (socialUserBind == null) { | ||
| 106 | - throw exception(AUTH_THIRD_LOGIN_NOT_BIND); | ||
| 107 | - } | ||
| 108 | - return new SocialUserRespDTO(socialUser.getOpenid(), socialUserBind.getUserId()); | 105 | + return new SocialUserRespDTO(socialUser.getOpenid(), socialUser.getNickname(), socialUser.getAvatar(), |
| 106 | + socialUserBind != null ? socialUserBind.getUserId() : null); | ||
| 109 | } | 107 | } |
| 110 | 108 | ||
| 111 | /** | 109 | /** |