diff --git a/common/common-util/src/main/java/com/atguigu/tingshu/common/util/AuthContextHolder.java b/common/common-util/src/main/java/com/atguigu/tingshu/common/util/AuthContextHolder.java index 87530fe..1bcdc2e 100644 --- a/common/common-util/src/main/java/com/atguigu/tingshu/common/util/AuthContextHolder.java +++ b/common/common-util/src/main/java/com/atguigu/tingshu/common/util/AuthContextHolder.java @@ -14,9 +14,8 @@ public class AuthContextHolder { } public static Long getUserId() { - //return userId.get(); - //TODO 暂时硬编码为1,后续做完登录验证后再修改 - return 1L; + return userId.get(); + } public static void removeUserId() { diff --git a/common/common-util/target/classes/com/atguigu/tingshu/common/util/AuthContextHolder.class b/common/common-util/target/classes/com/atguigu/tingshu/common/util/AuthContextHolder.class index d1817e4..5ef063e 100644 Binary files a/common/common-util/target/classes/com/atguigu/tingshu/common/util/AuthContextHolder.class and b/common/common-util/target/classes/com/atguigu/tingshu/common/util/AuthContextHolder.class differ diff --git a/common/service-util/src/main/java/com/atguigu/tingshu/common/login/GuiGuLogin.java b/common/service-util/src/main/java/com/atguigu/tingshu/common/login/GuiGuLogin.java new file mode 100644 index 0000000..dffd8ab --- /dev/null +++ b/common/service-util/src/main/java/com/atguigu/tingshu/common/login/GuiGuLogin.java @@ -0,0 +1,15 @@ +package com.atguigu.tingshu.common.login; + +import java.lang.annotation.*; + +@Target({ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +@Inherited +@Documented +public @interface GuiGuLogin { + /** + * 改接口调用是否需要必须登录 + * @return + */ + boolean required() default true; +} diff --git a/common/service-util/src/main/java/com/atguigu/tingshu/common/login/GuiGuLoginAspect.java b/common/service-util/src/main/java/com/atguigu/tingshu/common/login/GuiGuLoginAspect.java new file mode 100644 index 0000000..3a0a635 --- /dev/null +++ b/common/service-util/src/main/java/com/atguigu/tingshu/common/login/GuiGuLoginAspect.java @@ -0,0 +1,80 @@ +package com.atguigu.tingshu.common.login; + +import com.atguigu.tingshu.common.constant.RedisConstant; +import com.atguigu.tingshu.common.execption.GuiguException; +import com.atguigu.tingshu.common.result.ResultCodeEnum; +import com.atguigu.tingshu.common.util.AuthContextHolder; +import com.atguigu.tingshu.vo.user.UserInfoVo; +import jakarta.servlet.http.HttpServletRequest; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +/** + * @author: atguigu + * @create: 2025-07-21 09:49 + */ +@Slf4j +@Aspect +@Component +public class GuiGuLoginAspect { + + @Autowired + private RedisTemplate redisTemplate; + + + /** + * 为了代码规范:认证状态校验注解只能用在api包下,且只有使用@GuiGuLogin注解的方法才能被增强 + * + * @param pjp 目标方法对象 + * @return + * @throws Throwable + */ + @Around("execution(* com.atguigu.tingshu.*.api.*.*(..)) && @annotation(guiGuLogin)") + public Object doBasicProfiling(ProceedingJoinPoint pjp, GuiGuLogin guiGuLogin) throws Throwable { + log.info("一、前置逻辑"); + //1.获取用户令牌,用于查询redis中用户基本信息 + //1.1 获取请求对象 + //1.1.1 获取请求上下文对象 RequestAttributes是接口 + RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); + //1.1.2 获取请求对象 ServletRequestAttributes是实现类 + ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) requestAttributes; + HttpServletRequest request = servletRequestAttributes.getRequest(); + + //1.2 获取请求头:token + String token = request.getHeader("token"); + + //2.查询当时在登录成功后存入redis中用户基本信息 UserInfoVo + //2.1. 构建查询用户信息Redis的Key 注意:一定要跟登录成功存入Redis一致 + String loginKey = RedisConstant.USER_LOGIN_KEY_PREFIX + token; + //2.2 查询Redis中用户信息 + UserInfoVo userInfoVo = (UserInfoVo) redisTemplate.opsForValue().get(loginKey); + + //3.如果目标方法要求必须登录但查询Redis用户信息为空,抛出登录异常,响应业务状态码208 + if (guiGuLogin.required() && userInfoVo == null) { + log.error("用户未登录,引导用户登录"); + throw new GuiguException(ResultCodeEnum.LOGIN_AUTH); + } + + //4.如果查询Redis存在用户信息,将用户ID存入ThreadLocal中方便JavaEE三层任意层获取用户ID + if (userInfoVo != null) { + AuthContextHolder.setUserId(userInfoVo.getId()); + } + log.info("二、目标方法执行"); + Object retVal = pjp.proceed(); + log.info("三、后置逻辑"); + + //5.清理ThreadLocal防止内存泄漏 + AuthContextHolder.removeUserId(); + return retVal; + } + + +} diff --git a/common/service-util/target/classes/com/atguigu/tingshu/common/login/GuiGuLogin.class b/common/service-util/target/classes/com/atguigu/tingshu/common/login/GuiGuLogin.class new file mode 100644 index 0000000..5ae9846 Binary files /dev/null and b/common/service-util/target/classes/com/atguigu/tingshu/common/login/GuiGuLogin.class differ diff --git a/common/service-util/target/classes/com/atguigu/tingshu/common/login/GuiGuLoginAspect.class b/common/service-util/target/classes/com/atguigu/tingshu/common/login/GuiGuLoginAspect.class new file mode 100644 index 0000000..d3837fc Binary files /dev/null and b/common/service-util/target/classes/com/atguigu/tingshu/common/login/GuiGuLoginAspect.class differ diff --git a/service/service-account/src/main/java/com/atguigu/tingshu/account/receiver/AccountReceiver.java b/service/service-account/src/main/java/com/atguigu/tingshu/account/receiver/AccountReceiver.java new file mode 100644 index 0000000..78d134d --- /dev/null +++ b/service/service-account/src/main/java/com/atguigu/tingshu/account/receiver/AccountReceiver.java @@ -0,0 +1,49 @@ +package com.atguigu.tingshu.account.receiver; + +import cn.hutool.core.collection.CollUtil; +import com.atguigu.tingshu.account.service.UserAccountService; +import com.atguigu.tingshu.common.rabbit.constant.MqConst; +import com.rabbitmq.client.Channel; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.springframework.amqp.core.Message; +import org.springframework.amqp.rabbit.annotation.Exchange; +import org.springframework.amqp.rabbit.annotation.Queue; +import org.springframework.amqp.rabbit.annotation.QueueBinding; +import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Map; + +/** + * @author: atguigu + * @create: 2025-07-21 14:31 + */ +@Slf4j +@Component +public class AccountReceiver { + + @Autowired + private UserAccountService userAccountService; + + /** + * 用户首次登录,初始化账户信息 + * @param map + * @param channel + * @param message + */ + @SneakyThrows + @RabbitListener(bindings = @QueueBinding( + exchange = @Exchange(value = MqConst.EXCHANGE_USER, durable = "true"), + value = @Queue(value = MqConst.QUEUE_USER_REGISTER, durable = "true"), + key = MqConst.ROUTING_USER_REGISTER + )) + public void initUserAccountListener(Map map, Channel channel, Message message) { + if (CollUtil.isNotEmpty(map)) { + log.info("用户首次登录,初始化账户信息,消息:{}", map); + userAccountService.saveUserAccount(map); + } + channel.basicAck(message.getMessageProperties().getDeliveryTag(), false); + } +} diff --git a/service/service-account/src/main/java/com/atguigu/tingshu/account/service/UserAccountService.java b/service/service-account/src/main/java/com/atguigu/tingshu/account/service/UserAccountService.java index 6e5216a..4ef6495 100644 --- a/service/service-account/src/main/java/com/atguigu/tingshu/account/service/UserAccountService.java +++ b/service/service-account/src/main/java/com/atguigu/tingshu/account/service/UserAccountService.java @@ -3,7 +3,23 @@ package com.atguigu.tingshu.account.service; import com.atguigu.tingshu.model.account.UserAccount; import com.baomidou.mybatisplus.extension.service.IService; +import java.math.BigDecimal; +import java.util.Map; + public interface UserAccountService extends IService { + /** + * 保存账户记录 + * @param map + */ + void saveUserAccount(Map map); + /** + * 保存账户变动日志(例如:充值,消费) + * @param userId 用户ID + * @param title 内容 + * @param amount 金额 + * @param orderNo 订单编号 + */ + void saveUserAccountDetail(Long userId, String title, BigDecimal amount, String orderNo); } diff --git a/service/service-account/src/main/java/com/atguigu/tingshu/account/service/impl/UserAccountServiceImpl.java b/service/service-account/src/main/java/com/atguigu/tingshu/account/service/impl/UserAccountServiceImpl.java index 0ba782b..f1cfad4 100644 --- a/service/service-account/src/main/java/com/atguigu/tingshu/account/service/impl/UserAccountServiceImpl.java +++ b/service/service-account/src/main/java/com/atguigu/tingshu/account/service/impl/UserAccountServiceImpl.java @@ -1,12 +1,19 @@ package com.atguigu.tingshu.account.service.impl; +import com.atguigu.tingshu.account.mapper.UserAccountDetailMapper; import com.atguigu.tingshu.account.mapper.UserAccountMapper; import com.atguigu.tingshu.account.service.UserAccountService; +import com.atguigu.tingshu.common.constant.SystemConstant; import com.atguigu.tingshu.model.account.UserAccount; +import com.atguigu.tingshu.model.account.UserAccountDetail; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.util.Map; @Slf4j @Service @@ -15,5 +22,40 @@ public class UserAccountServiceImpl extends ServiceImpl map) { + //1.新增账户记录 + Long userId = (Long) map.get("userId"); + BigDecimal amount = (BigDecimal) map.get("amount"); + UserAccount userAccount = new UserAccount(); + userAccount.setUserId(userId); + userAccount.setTotalAmount(amount); + userAccount.setLockAmount(BigDecimal.ZERO); + userAccount.setAvailableAmount(amount); + userAccount.setTotalIncomeAmount(amount); + userAccount.setTotalPayAmount(BigDecimal.ZERO); + int rows = userAccountMapper.insert(userAccount); + if (rows > 0) { + String title = (String) map.get("title"); + String orderNo = (String) map.get("orderNo"); + //2.保存账户变动日志 + this.saveUserAccountDetail(userId, title, amount, orderNo); + } + + + } + @Override + public void saveUserAccountDetail(Long userId, String title, BigDecimal amount, String orderNo) { + UserAccountDetail userAccountDetail = new UserAccountDetail(); + userAccountDetail.setUserId(userId); + userAccountDetail.setTitle(title); + userAccountDetail.setTradeType(SystemConstant.ACCOUNT_TRADE_TYPE_DEPOSIT); + userAccountDetail.setAmount(amount); + userAccountDetail.setOrderNo(orderNo); + userAccountDetailMapper.insert(userAccountDetail); + } } diff --git a/service/service-album/src/main/java/com/atguigu/tingshu/album/api/AlbumInfoApiController.java b/service/service-album/src/main/java/com/atguigu/tingshu/album/api/AlbumInfoApiController.java index 78d873b..05d86ba 100644 --- a/service/service-album/src/main/java/com/atguigu/tingshu/album/api/AlbumInfoApiController.java +++ b/service/service-album/src/main/java/com/atguigu/tingshu/album/api/AlbumInfoApiController.java @@ -1,6 +1,7 @@ package com.atguigu.tingshu.album.api; import com.atguigu.tingshu.album.service.AlbumInfoService; +import com.atguigu.tingshu.common.login.GuiGuLogin; import com.atguigu.tingshu.common.result.Result; import com.atguigu.tingshu.common.util.AuthContextHolder; import com.atguigu.tingshu.model.album.AlbumInfo; @@ -28,6 +29,7 @@ public class AlbumInfoApiController { @Operation(summary = "新建专辑信息") + @GuiGuLogin @PostMapping("/albumInfo/saveAlbumInfo") public Result saveAlbumInfo(@Validated @RequestBody AlbumInfoVo albumInfoVo) { Long userId = AuthContextHolder.getUserId(); @@ -37,11 +39,11 @@ public class AlbumInfoApiController { } //这个是在登录到专辑页面的时候,会调用这个接口,获取当前登录用户的专辑信息 + @GuiGuLogin @Operation(summary = "分页条件查询当前登录用户发布专辑") @PostMapping("/albumInfo/findUserAlbumPage/{page}/{limit}") public Result> findUserAlbumPage(@PathVariable Long page, - @PathVariable Long limit, - @RequestBody AlbumInfoQuery albumInfoQuery){ + @PathVariable Long limit,@RequestBody AlbumInfoQuery albumInfoQuery){ //先从线程中取出来用户id Long userId = AuthContextHolder.getUserId(); //将用户id放进到查询条件中 @@ -81,6 +83,7 @@ public class AlbumInfoApiController { * 查询当前用户专辑列表 * @return */ + @GuiGuLogin @Operation(summary = "查询当前用户专辑列表") @GetMapping("/albumInfo/findUserAllAlbumList") public Result> findUserAllAlbumList(){ diff --git a/service/service-album/src/main/java/com/atguigu/tingshu/album/api/TrackInfoApiController.java b/service/service-album/src/main/java/com/atguigu/tingshu/album/api/TrackInfoApiController.java index c9c82b8..aa516f3 100644 --- a/service/service-album/src/main/java/com/atguigu/tingshu/album/api/TrackInfoApiController.java +++ b/service/service-album/src/main/java/com/atguigu/tingshu/album/api/TrackInfoApiController.java @@ -2,6 +2,7 @@ package com.atguigu.tingshu.album.api; import com.atguigu.tingshu.album.service.TrackInfoService; import com.atguigu.tingshu.album.service.VodService; +import com.atguigu.tingshu.common.login.GuiGuLogin; import com.atguigu.tingshu.common.result.Result; import com.atguigu.tingshu.common.util.AuthContextHolder; import com.atguigu.tingshu.model.album.TrackInfo; @@ -47,6 +48,7 @@ public class TrackInfoApiController { * @param trackInfoVo * @return */ + @GuiGuLogin @Operation(summary = "保存声音") @PostMapping("/trackInfo/saveTrackInfo") public Result saveTrackInfo(@Validated @RequestBody TrackInfoVo trackInfoVo) { @@ -63,6 +65,7 @@ public class TrackInfoApiController { * @param trackInfoQuery * @return */ + @GuiGuLogin @Operation(summary = "分页条件查询当前用户声音列表") @PostMapping("/trackInfo/findUserTrackPage/{page}/{limit}") public Result> findUserTrackPage( diff --git a/service/service-album/target/classes/com/atguigu/tingshu/album/api/AlbumInfoApiController.class b/service/service-album/target/classes/com/atguigu/tingshu/album/api/AlbumInfoApiController.class index 149237c..4738c4b 100644 Binary files a/service/service-album/target/classes/com/atguigu/tingshu/album/api/AlbumInfoApiController.class and b/service/service-album/target/classes/com/atguigu/tingshu/album/api/AlbumInfoApiController.class differ diff --git a/service/service-album/target/classes/com/atguigu/tingshu/album/api/TrackInfoApiController.class b/service/service-album/target/classes/com/atguigu/tingshu/album/api/TrackInfoApiController.class index 3126234..be54a1a 100644 Binary files a/service/service-album/target/classes/com/atguigu/tingshu/album/api/TrackInfoApiController.class and b/service/service-album/target/classes/com/atguigu/tingshu/album/api/TrackInfoApiController.class differ diff --git a/service/service-user/pom.xml b/service/service-user/pom.xml index e2d8a92..924d6bb 100644 --- a/service/service-user/pom.xml +++ b/service/service-user/pom.xml @@ -32,6 +32,11 @@ org.springframework.boot spring-boot-starter-data-mongodb + + com.github.binarywang + wx-java-miniapp-spring-boot-starter + 4.5.0 + diff --git a/service/service-user/src/main/java/com/atguigu/tingshu/user/api/WxLoginApiController.java b/service/service-user/src/main/java/com/atguigu/tingshu/user/api/WxLoginApiController.java index 5b67c1e..b7e1e07 100644 --- a/service/service-user/src/main/java/com/atguigu/tingshu/user/api/WxLoginApiController.java +++ b/service/service-user/src/main/java/com/atguigu/tingshu/user/api/WxLoginApiController.java @@ -1,11 +1,17 @@ package com.atguigu.tingshu.user.api; +import com.atguigu.tingshu.common.login.GuiGuLogin; +import com.atguigu.tingshu.common.result.Result; +import com.atguigu.tingshu.common.util.AuthContextHolder; import com.atguigu.tingshu.user.service.UserInfoService; +import com.atguigu.tingshu.vo.user.UserInfoVo; +import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; + +import java.util.Map; @Tag(name = "微信授权登录接口") @RestController @@ -16,5 +22,47 @@ public class WxLoginApiController { @Autowired private UserInfoService userInfoService; + /** + * 微信一键登录 + * + * @param code 小程序集成微信基于当前微信用户生成临时票据code + * @return {token:"令牌"} + */ + @Operation(summary = "小程序端微信一键登录") + @GetMapping("/wxLogin/{code}") + public Result> wxLogin(@PathVariable String code) { + Map map = userInfoService.wxLogin(code); + return Result.ok(map); + } + + + /** + * 获取当前登录用户基本信息 + * @return + */ + @GuiGuLogin + @GetMapping("/getUserInfo") + @Operation(summary = "获取当前登录用户基本信息") + public Result getUserInfo() { + Long userId = AuthContextHolder.getUserId(); + UserInfoVo userInfoVo = userInfoService.getUserInfo(userId); + return Result.ok(userInfoVo); + } + + + /** + * 更新当前用户基本信息 + * @param userInfoVo + * @return + */ + @GuiGuLogin + @Operation(summary = "更新当前用户基本信息") + @PostMapping("/updateUser") + public Result updateUser(@RequestBody UserInfoVo userInfoVo) { + Long userId = AuthContextHolder.getUserId(); + userInfoService.updateUser(userInfoVo, userId); + return Result.ok(); + } + } diff --git a/service/service-user/src/main/java/com/atguigu/tingshu/user/service/UserInfoService.java b/service/service-user/src/main/java/com/atguigu/tingshu/user/service/UserInfoService.java index a8e1031..93fdb4b 100644 --- a/service/service-user/src/main/java/com/atguigu/tingshu/user/service/UserInfoService.java +++ b/service/service-user/src/main/java/com/atguigu/tingshu/user/service/UserInfoService.java @@ -1,8 +1,16 @@ package com.atguigu.tingshu.user.service; import com.atguigu.tingshu.model.user.UserInfo; +import com.atguigu.tingshu.vo.user.UserInfoVo; import com.baomidou.mybatisplus.extension.service.IService; +import java.util.Map; + public interface UserInfoService extends IService { + Map wxLogin(String code); + + UserInfoVo getUserInfo(Long userId); + + void updateUser(UserInfoVo userInfoVo, Long userId); } diff --git a/service/service-user/src/main/java/com/atguigu/tingshu/user/service/impl/UserInfoServiceImpl.java b/service/service-user/src/main/java/com/atguigu/tingshu/user/service/impl/UserInfoServiceImpl.java index 7e5f895..4358772 100644 --- a/service/service-user/src/main/java/com/atguigu/tingshu/user/service/impl/UserInfoServiceImpl.java +++ b/service/service-user/src/main/java/com/atguigu/tingshu/user/service/impl/UserInfoServiceImpl.java @@ -1,19 +1,104 @@ package com.atguigu.tingshu.user.service.impl; +import cn.binarywang.wx.miniapp.api.WxMaService; +import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.IdUtil; +import com.atguigu.tingshu.common.constant.RedisConstant; +import com.atguigu.tingshu.common.rabbit.constant.MqConst; +import com.atguigu.tingshu.common.rabbit.service.RabbitService; import com.atguigu.tingshu.model.user.UserInfo; import com.atguigu.tingshu.user.mapper.UserInfoMapper; import com.atguigu.tingshu.user.service.UserInfoService; +import com.atguigu.tingshu.vo.user.UserInfoVo; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.extern.slf4j.Slf4j; +import me.chanjar.weixin.common.error.WxErrorException; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; +import java.math.BigDecimal; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.TimeUnit; + @Slf4j @Service @SuppressWarnings({"all"}) public class UserInfoServiceImpl extends ServiceImpl implements UserInfoService { - @Autowired - private UserInfoMapper userInfoMapper; + @Autowired + private UserInfoMapper userInfoMapper; + @Autowired + private WxMaService wxMaService; + @Autowired + private RedisTemplate redisTemplate; + @Autowired + private RabbitService rabbitService; + @Override + public Map wxLogin(String code) { + try { + //1.根据小程序提交的临时票据code调用微信接口服务,获取当前微信用户唯一标识openid + WxMaJscode2SessionResult sessionInfo = wxMaService.getUserService().getSessionInfo(code); + String wxOpenid = sessionInfo.getOpenid(); + //2.根据openid查询数据库用户表,判断微信账户是否关联用户 + UserInfo userInfo = userInfoMapper.selectOne( + new LambdaQueryWrapper() + .eq(UserInfo::getWxOpenId, wxOpenid) + );//3.如果不存在用户记录,说明该微信是首次登录 + if (userInfo == null) { + //3.1 新增用户记录 + userInfo = new UserInfo(); + userInfo.setWxOpenId(wxOpenid); + userInfo.setNickname("听友" + IdUtil.nanoId()); + userInfo.setAvatarUrl("http://192.168.200.6:9000/tingshu/2025-07-21/1ce194e3-4212-4ff8-948b-babd9a7b8a02.jpg"); + userInfoMapper.insert(userInfo); + //3.2 TODO 隐式初始化账户记录,用于后续订单消费,采用MQ + //3.2.1 创建初始化账户MQ消息对象 注意:如果使用的是VO对象,该对象必须得实现序列化接口 Serializable + Map mqData = new HashMap<>(); + mqData.put("userId", userInfo.getId()); + mqData.put("amount", BigDecimal.valueOf(100)); + mqData.put("orderNo", "ZS"+ DateUtil.today().replaceAll("-", "")+IdUtil.getSnowflakeNextId()); + mqData.put("title", "首次注册,赠送体验金活动"); + + //3.2.2 发送消息到RabbitMQ交换机 todo 使用RabbitService + rabbitService.sendMessage(MqConst.EXCHANGE_USER, MqConst.ROUTING_USER_REGISTER, mqData); + + } + //4.无论是否首次登录,都需要生成令牌,返回给小程序 + //4.1 生成随机令牌 + String token = IdUtil.randomUUID(); + //4.2 将用户令牌作为Key,用户基本信息UserInfoVo作为Value,保存到Redis中 + String loginKey = RedisConstant.USER_LOGIN_KEY_PREFIX + token; + UserInfoVo userInfoVo = BeanUtil.copyProperties(userInfo, UserInfoVo.class); + redisTemplate.opsForValue().set(loginKey, userInfoVo, RedisConstant.USER_LOGIN_KEY_TIMEOUT, TimeUnit.SECONDS); + //4.3 返回用户令牌 + return Map.of("token", token); + } catch (WxErrorException e) { + log.error("微信登录失败:{}", e.getMessage()); + throw new RuntimeException(e); + } + + } + + @Override + public UserInfoVo getUserInfo(Long userId) { + UserInfo userInfo = userInfoMapper.selectById(userId); + return BeanUtil.copyProperties(userInfo, UserInfoVo.class); + + } + + @Override + public void updateUser(UserInfoVo userInfoVo, Long userId) { + UserInfo userInfo = new UserInfo(); + userInfo.setId(userId); + userInfo.setAvatarUrl(userInfoVo.getAvatarUrl()); + userInfo.setNickname(userInfoVo.getNickname()); + userInfoMapper.updateById(userInfo); + + } } diff --git a/service/service-user/target/classes/com/atguigu/tingshu/user/api/WxLoginApiController.class b/service/service-user/target/classes/com/atguigu/tingshu/user/api/WxLoginApiController.class index a0cc8ef..31f2e38 100644 Binary files a/service/service-user/target/classes/com/atguigu/tingshu/user/api/WxLoginApiController.class and b/service/service-user/target/classes/com/atguigu/tingshu/user/api/WxLoginApiController.class differ diff --git a/service/service-user/target/classes/com/atguigu/tingshu/user/service/UserInfoService.class b/service/service-user/target/classes/com/atguigu/tingshu/user/service/UserInfoService.class index f6cb7d6..cfe09f4 100644 Binary files a/service/service-user/target/classes/com/atguigu/tingshu/user/service/UserInfoService.class and b/service/service-user/target/classes/com/atguigu/tingshu/user/service/UserInfoService.class differ diff --git a/service/service-user/target/classes/com/atguigu/tingshu/user/service/impl/UserInfoServiceImpl.class b/service/service-user/target/classes/com/atguigu/tingshu/user/service/impl/UserInfoServiceImpl.class index e06a453..81b96c3 100644 Binary files a/service/service-user/target/classes/com/atguigu/tingshu/user/service/impl/UserInfoServiceImpl.class and b/service/service-user/target/classes/com/atguigu/tingshu/user/service/impl/UserInfoServiceImpl.class differ