From 1378baeac650ccc3e42729bc2f029ce876d9570d Mon Sep 17 00:00:00 2001 From: Y1NanPing <735289578@qq.com> Date: Tue, 22 Jul 2025 19:00:12 +0800 Subject: [PATCH] =?UTF-8?q?=E7=AC=AC=E5=9B=9B=E6=AC=A1=E8=AF=BE=E7=A8=8B?= =?UTF-8?q?=E6=8F=90=E4=BA=A4=20=E8=AE=A4=E8=AF=81=E7=99=BB=E5=BD=95?= =?UTF-8?q?=E5=92=8C=E7=94=A8=E6=88=B7=E7=9A=84=E5=88=9D=E5=A7=8B=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/util/AuthContextHolder.java | 5 +- .../common/util/AuthContextHolder.class | Bin 1017 -> 1019 bytes .../tingshu/common/login/GuiGuLogin.java | 15 +++ .../common/login/GuiGuLoginAspect.java | 80 ++++++++++++++++ .../tingshu/common/login/GuiGuLogin.class | Bin 0 -> 544 bytes .../common/login/GuiGuLoginAspect.class | Bin 0 -> 4036 bytes .../account/receiver/AccountReceiver.java | 49 ++++++++++ .../account/service/UserAccountService.java | 16 ++++ .../service/impl/UserAccountServiceImpl.java | 42 +++++++++ .../album/api/AlbumInfoApiController.java | 7 +- .../album/api/TrackInfoApiController.java | 3 + .../album/api/AlbumInfoApiController.class | Bin 5175 -> 5235 bytes .../album/api/TrackInfoApiController.class | Bin 5662 -> 5718 bytes service/service-user/pom.xml | 5 + .../user/api/WxLoginApiController.java | 52 +++++++++- .../tingshu/user/service/UserInfoService.java | 8 ++ .../service/impl/UserInfoServiceImpl.java | 89 +++++++++++++++++- .../user/api/WxLoginApiController.class | Bin 971 -> 3148 bytes .../user/service/UserInfoService.class | Bin 340 -> 731 bytes .../service/impl/UserInfoServiceImpl.class | Bin 1106 -> 7886 bytes 20 files changed, 362 insertions(+), 9 deletions(-) create mode 100644 common/service-util/src/main/java/com/atguigu/tingshu/common/login/GuiGuLogin.java create mode 100644 common/service-util/src/main/java/com/atguigu/tingshu/common/login/GuiGuLoginAspect.java create mode 100644 common/service-util/target/classes/com/atguigu/tingshu/common/login/GuiGuLogin.class create mode 100644 common/service-util/target/classes/com/atguigu/tingshu/common/login/GuiGuLoginAspect.class create mode 100644 service/service-account/src/main/java/com/atguigu/tingshu/account/receiver/AccountReceiver.java 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 d1817e41094aab48a7563b79954b0d3732723cd8..5ef063e21de518352ecb3e0b35526b6545073b41 100644 GIT binary patch delta 119 zcmey#{+oTmBTGI85grCn1~Enk=JeDOMg|cLO`oj9vPAuy#JqHU|D>$cXoEcyM delta 117 zcmey({*!&eBO4J0QFaC~9tLp+2}TCKti-ZJ{hY+SbbX)vymUqe_OisB(p3L6Mh0OG zFHIj*Y3t3>jDbvYvJ6ZNAi&DCgF$!$kip2H1SHvjGy{Y1dk%5}7k(VM(gaoo)-_58vx#*%7sc8Q<3MS*ZB^TL z)6hXdpf;6r>4s7VZhtf--#91<9A;Umb!?qA}C{WL;O?s6! zGZvr`JK!*{y`q%Q27f6ox#(+*XgzXbnWN~CCbp4 z;p645&Dgi;oXj)?c%OWV>F)S@9F$qDu*wfnK@O`N=CFo!zE4rW2A8WZ5QG})*i02+ L3)|RXU>EoS3Fn)8 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..d3837fcd44bfc50560a0aed18330f1492a5e34b2 GIT binary patch literal 4036 zcmb7H`+F4C8Gg^^GP|1*LWG(%)dGdM36Me2in~Dxkz6D|NAz73_Md3`o|!e9%NoOz?97=n-}&y}`+f7T z|6ctFz&^Z_L<}_=YIW41UZ8Q(oHmVuY3Gfjqmwe{3)FX7w&g!8P?K&ONg$4dhNO-L z=mPiVoT6d+`M}BthHu$*hm$Z9~7vy>~Tk6 zQ+lAH{*dodpKRMm5?{a_8k%*aaHl|Lc)X-uj=N@2&N%LrF(XH*w(ZN4zTwKJ1L^t3 zvFP3%ZTC5aG3g3y%uB!grpu>@(ZH9Uz`k@_WYF3fSB_^jd{JQkS`{0T?sTDw7D=?= zZXI93W`SfyO@SR$Zql4GUEegk=&&*2`z51~m!;eogslQ~zB48525iH24XrxvL0aIR zHL?&$Pisd37KfCKt}7YRMTfFU+>84(?9p*Q9$+q4^Z%+G1R9)@*W)~0uQ8b{k(#(P8`=Ug2(9&#<`#FYzm9|)3^>e#JVJ&zzGdc>i9ao zu{t;hzEv=~g0Q+2>U|1t2~YZA=qcg$#ibhxXd8*+DS_teSI-ioZ@%{K{2MRKzcM%f z{>Aw-Z+-IS*#?*x)sWLM2G+wimB?lY`;$>m8FZbTWD(l=#~jNZk^yF z=^KY?7uRRcsJ8I(xrMf%thIDZsK~M3vAyi$`Q-6MhmjbwjDnzV}ZR@L1;>u%)*H2TI#vHS?f<&Y&v^Z%O!T%D(#n| z8poUirf20Ci*c*KPzdDHq2`|#s_d=Es|Gs+fzl*H(z-Trs*Np-4+6VxNxZ;@awo4e zT7hiU5UtYwD~IX2=5qI}G5{P{GvlQVcL{&3tg*n_8@5W33ci=89s+L||3i{#o>YJy zVYxtc{8@?mw6@-rKHJPv0p+4(2Ojdx+|*&S6y~IcvjPuQYg}vct%h?;X3xkBs=ff@ zo`&;;q>81(6RtB8)kx!E=}$OggQlA2eCe_@wyn&t#g*qefvw7}ZaV7R{i=Hq6CFF< zzL@~uQJ!f#$}??8dxu%Fcx_L2bhNc?Zf)JXzrrtF$G-Eg(&%=ICC8SwPvXV{j^lg2YnCF{cSACl6Glw?Ona;#J-XVN3QF0PS-5Ct$-!Z& zTZR0|Mf6ohmokfPvrrhae91}mcLaWw+nF%eGlGx(wk_Qdz9lo}kHqyAR#sD9!`lLP zuTIK>h%Chx4x%v*tTEiFK7+y)r&0(!&2>HRF7GwG^P7rSk5B5Y;JvQ>3dCQzh{5Mo zy$0v@fLA>tz%*v~BybX^P^%7$=g2I{y$kO_Yr1U?>tmS3rX#yPMoXqPReKqCW$IFO zO~yCcBiyCd?kjD(V2 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 149237ce8c72b63c93fd85e4f5eeefcd05256c43..4738c4bfa909d2253c4c7ae40553339a510674f8 100644 GIT binary patch delta 754 zcmZuuOK%cU6#ni2wSYQIX+lhi(WnX0AWfwtq>!*Mf=Iwut1a?STM?nqmg1u-_}2a1 z`vGB;6YOU)B>rdp;YH{2{f5>`~aDT*z0H!!+eOg@el`u1)3mS zbSl!y@BuC&%bUlj4DjI+a?E;V5_oB91DnLPQJI#u#wk14wkW&flqo!vKc>$1^Q0`; zC{>G69a4h3&2z@2bSs9tJT;9ue1yjq-4laOQ-%)h3qOye^p@fMCLv|dA95GD#S&R6 za?gLfv4f{P80}J};T=3<$8`Dpe~atcoc1~Tg6IlfTBEP1<8=pb@RkSfES2y70isc4 A&j0`b delta 736 zcmZWm*)9W782)D3qAgmjsDxN=8e$0|vAYn&u69c8Ypu1_R=Wq77w`%qA#vdWTzUl& z4^GgguxJoFw9_N0#XR07~`~EVs)Is1doIY_?35OZ=@6!l*7(@HY!nsDs-^k zhy;Gi(TOhp)o2p^oKmAHMzV+kn1+e-#pq+sOoVjIV3wIV)|1(zZN#s3Ede&S*or(6>CDb%5IT( zK|EOy>qONSwIRq7C7q_81VLAsrIib6Q|?_Jp9W{Ap-pU&%mA#~k+B_5u!E3Jup3X% zj6KEbE{$}Npj$Y|<3_<3jcwi$b)e>Y&>N++%EC*}e?R*;(CH2ZU78&AV|@M=XGp2Uz~MVmS#hJ{#mBxY9T5TVVww3#x`^J6Q10kIMB0Y1Ri zpNLb{Lz=~_cXRK3XR3$tuX644=j{VPBkrHHVog-YM|*zO^xSx8wkjA21tTqH`BJK# zrHWkn>I|wSNJps@+0SWpNI^X^(IDTmYisgg!!(hGATX?B1|uv+`yh18VvK`y0R?j` z=6M8~upo$}?87A3F;l3M7SZ1e} zb36B=ofUTa*~zdW%uDB4muu3xEpV+k|vFoPTJh*Jc+u&;a8&$oDEm`TVHU{CK z(=N^nsR?kQ8$GfrL%cY zg%N?qR841IB7r{R&KxmkNq)>MlYE@wEJ1bt*N1`&?kc!UI0Uq6ATb9R04cZ6f2+E^6!+DnK e;=d3XmxPpYrLR{?3Dorg.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 a0cc8ef98c0d2b17881c44255b80183252de84c8..31f2e38001f10683e83d1dc8d908ca1c2f94deb4 100644 GIT binary patch literal 3148 zcmb7G>u(fQ6#w16wvUyT7I`WHrP`LlM0~kqKFyMFp4tA^mgz?;&+3i%OX1mGGow;-FIluEek2!z-^WYJH zmyu~k4QgYki=!S53~iUhtl)+)b9_8~Ny|744gI>QI|B^0-94!$G@>bn<~UjqXE>0N zc`lrstLI$q=w{BIak*=278eDbpTClnIo%vA=tI(UENK{;#n7tWkDAkRQnP0DjK**< zxvClxRWkhC$}@=;tV3%IZE>teJH!69Dqx7s`REuryOYaaPdXO4k?8TaTt_$fm?$Kg zu>nuVurZEJ*v!x!Wsmmq(&UzAyN1IjyoI4gUS=2woA8Mx6V)mq>szrchG*h<7TZ^0 zJ+ST}9(0`V!bJ+IUb2whW75jJul8lN&YH6cf_$1yBJ!^q7);B<6-EY zY&7s$=?A_Xsg(4T?vA4i&oeZ;g{*Ki^_C&g9qD_7icn;H+bI=^ZWV?ehCXs+4J7VC zUkrQW*ayzANm@B>8`Fm`amv!1W(|vsBdx1GRsI%3SJ?X@L)bRO?Y}1zswxh|aS(^7 zN(`AJik}o>*fQaoj-J<2x~-=TZO}BOBOG0tHp4OhKtW~Sv?cP|oU|_Uv?ffOPy5KY zs2t!FVL7K;S~kH@Hzc!EMXgEQ)Xup1v}R2SQtyGt2qPsdT|Ebzb%*gCnp?G#Qi|A;Y)N`hAT#IOP!!cj8lL3k{{whH!SUpKya(hmwWaP7lxD<9M zK?+7T0@`ck1ULc)}%tVH&Qrg#ncFNlaILi zh)eB6H%UIuSM=81e_dZF&fhFP{IdAj7k<2!ZrmzeTPS}2p!Dr86w1;kcNnIsc6ANy zkTR$A&ArmiyMgrxyGN>zp|nG()562ezIrVa+6S&?JEvs!Dsk1=pD}{Tqj^%gRz@4v zRae^*HCF6XO+)3x|Cf*>ayFk5D!=PYDt?B|e#w-sUn_n0sUL#U^`DCKKd#o2qY8(< z_0IB$L&~GOdGt}w=jFOv@AY4=5eJ1wU*$%c(m?;M>Ko(T(f9?bZMtuu^$4x?w9*Vm z*Q4~rX=Q4+cLD5Ix~aj7bXBiGU(jQ8RSMLxmvEd`Mw3*6p48#28VYG`>%E8Ap8I&J z24j7T=(tOJwVoa|HUhh73heZB?eOITU33!tG+ojxK^g~ef}~H9yt3%;4ARai+NozG z2n^A`2CsPjY@)kYNpRT42u{<@=tVFauibi;_19x|%nzC|Y#+zpG^k_;d} z7lQ1&zRr{3sKb7=;y?)Yh5&XQ!5+gI(%nk1$8nbQ`pDk!kZmIk6J%!@)MOdy6dmfq zIa00wT_8aPsDl8Fd4T%vqq7!^ctKGZ#xp=iPLREmAv_%w8aq4`l&mD7kX1+;GDV!%DK4EVz6Lx_l8;PcJa_l4_^=oQxTtx40*sl_Vg%YHLEM26%8oXUG^A1V8 OYvVnCF$Mv6*0yd9^LY;>1S9|t#=<7+x-99eK^{WLABv5jI! zcuBBsHAT^04fE~Sr}3W$Wtzf6$svgrZ9$LS->mSCb-=Ic7yLP!GZ7X44)Eb|SI> 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 f6cb7d69ca0de10bc3e3217bbaf2f84a663c30e9..cfe09f430fa2acf8bec88fb67a1677995e0f6e8b 100644 GIT binary patch literal 731 zcmb7COHRWu5FMwV(3U@i3$Q60jKq!fr)3}$ zkrOx_1YfwJR@jYqR+)?zDIKx7hqXssPi1`16wA2gsvyveWXuV4LXqT58-;)WcdX&h zYCkPESh1IIy<&mD)jDz@%N{q8xR4c(tIV-PsJ5lnj|p_mJZ73(CjoB|{1IWT!K(Dw zLRn1Q&{z^sYZ29Iyb}ALYZ-2AC_|dl?^Ah}pl&FQiukQak@@~=;CjR7cBgn91R5wU zyuAiqkPBPjKnJxJ=Ht^tabO!=JFts^wQCQ`dxL}8)N$YtBhie}Rn8IgOYQgrY$e(l delta 53 zcmcc3dWDJW)W2Q(7#J9A8Mr5MwR3R>XQt;RmXsEyPQJ^yOqhXziGdv`%f!IJzzL?g E0LLQ?f&c&j 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 e06a453d17d6a872fcc94072e67c4542121530f3..81b96c3a700a515062659454ae11948f334131b6 100644 GIT binary patch literal 7886 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 k(%F7drlGOG>@$$QgS%nSIQRg> zXyOAIZ);>Z=R4=#d%pA8`!?;x&)YlD<9KFY>jviRpV4Vxxq%>c02i0yUYjfN6YNqCh;hqTqvwT9F1-!(`=|% zx1imQYxr!T1Ia_kEh%TQ-W t(D_?nmpxG?`^)2?oPgySomZ?mYej;R@Bb63=p2aBXiLF@50_<*;1_ctC>a0%