package com.ruoyi.auth.service; import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.ruoyi.common.core.utils.StringUtils; import com.ruoyi.common.security.service.TokenService; import com.ruoyi.system.api.domain.AccountMember; import com.ruoyi.system.api.domain.SysUser; import com.ruoyi.system.api.model.LoginUser; /** * 小程序会员令牌签发组件 * * 用户端与服务商端登录共用同一套「以 AccountMember 组装 LoginUser 并签发令牌」逻辑, * 抽离于此避免重复实现。 * * @author hugray */ @Component public class AccountTokenIssuer { private static final Logger log = LoggerFactory.getLogger(AccountTokenIssuer.class); @Autowired private TokenService tokenService; /** * 组装登录态并签发令牌 * * @param member C端会员信息 * @param scene 登录场景(仅用于日志标记) * @return 令牌信息(access_token、expires_in) */ public Map issue(AccountMember member, String scene) { LoginUser loginUser = buildLoginUser(member); log.info("[ACCOUNT_LOGIN] {} success, userId={}", scene, member.getUserId()); return tokenService.createToken(loginUser); } /** * 组装登录用户对象(以 SysUser 作为令牌载体,兼容 TokenService) * * @param member C端会员信息 * @return 登录用户对象 */ private LoginUser buildLoginUser(AccountMember member) { SysUser sysUser = new SysUser(); sysUser.setUserId(member.getUserId()); // TokenService 依赖 userName 生成令牌,缺失时回退为手机号 sysUser.setUserName(StringUtils.isNotEmpty(member.getUserName()) ? member.getUserName() : member.getPhone()); sysUser.setNickName(member.getNickname()); sysUser.setPhonenumber(member.getPhone()); sysUser.setAvatar(member.getAvatar()); sysUser.setStatus(member.getStatus()); LoginUser loginUser = new LoginUser(); loginUser.setSysUser(sysUser); return loginUser; } }