diff --git a/game-dao/src/main/java/awesome/group/game/dao/bean/GameApp.java b/game-dao/src/main/java/awesome/group/game/dao/bean/GameApp.java index 5446449..f2b42d7 100644 --- a/game-dao/src/main/java/awesome/group/game/dao/bean/GameApp.java +++ b/game-dao/src/main/java/awesome/group/game/dao/bean/GameApp.java @@ -1,7 +1,6 @@ package awesome.group.game.dao.bean; import lombok.Data; -import org.springframework.context.annotation.Bean; @Data public class GameApp { diff --git a/game-dao/src/main/java/awesome/group/game/dao/bean/InviteRecord.java b/game-dao/src/main/java/awesome/group/game/dao/bean/InviteRecord.java new file mode 100644 index 0000000..cdee517 --- /dev/null +++ b/game-dao/src/main/java/awesome/group/game/dao/bean/InviteRecord.java @@ -0,0 +1,13 @@ +package awesome.group.game.dao.bean; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; + +@Data +public class InviteRecord { + @TableId(value = "id", type = IdType.AUTO) + public Integer id; + public Integer userId; + public Integer invitedUserId; +} diff --git a/game-dao/src/main/java/awesome/group/game/dao/bean/User.java b/game-dao/src/main/java/awesome/group/game/dao/bean/User.java deleted file mode 100644 index f1ae3c3..0000000 --- a/game-dao/src/main/java/awesome/group/game/dao/bean/User.java +++ /dev/null @@ -1,8 +0,0 @@ -package awesome.group.game.dao.bean; - -import lombok.Data; - -@Data -public class User { - private Integer id; -} diff --git a/game-dao/src/main/java/awesome/group/game/dao/bean/WeGameUser.java b/game-dao/src/main/java/awesome/group/game/dao/bean/WeGameUser.java index f88d9bc..9be4170 100644 --- a/game-dao/src/main/java/awesome/group/game/dao/bean/WeGameUser.java +++ b/game-dao/src/main/java/awesome/group/game/dao/bean/WeGameUser.java @@ -20,6 +20,7 @@ public class WeGameUser { private String unionId; private String sessionKey; private Integer score; + private String inviteCode; public String getNickname() { if (StringUtils.hasText(nickname)) { diff --git a/game-dao/src/main/java/awesome/group/game/dao/mapper/InviteRecordMapper.java b/game-dao/src/main/java/awesome/group/game/dao/mapper/InviteRecordMapper.java new file mode 100644 index 0000000..4a872ef --- /dev/null +++ b/game-dao/src/main/java/awesome/group/game/dao/mapper/InviteRecordMapper.java @@ -0,0 +1,13 @@ +package awesome.group.game.dao.mapper; + +import awesome.group.game.dao.bean.InviteRecord; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +public interface InviteRecordMapper extends BaseMapper { + @Select("select invited_user_id from invite_record where user_id = #{userId}") + List query(@Param("userId") Integer userId); +} diff --git a/game-dao/src/main/java/awesome/group/game/dao/mapper/UserMapper.java b/game-dao/src/main/java/awesome/group/game/dao/mapper/UserMapper.java deleted file mode 100644 index 2a4838e..0000000 --- a/game-dao/src/main/java/awesome/group/game/dao/mapper/UserMapper.java +++ /dev/null @@ -1,7 +0,0 @@ -package awesome.group.game.dao.mapper; - -import awesome.group.game.dao.bean.User; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; - -public interface UserMapper extends BaseMapper { -} diff --git a/game-dao/src/main/java/awesome/group/game/dao/mapper/WeGameUserMapper.java b/game-dao/src/main/java/awesome/group/game/dao/mapper/WeGameUserMapper.java index e1ed4d1..ebeeacb 100644 --- a/game-dao/src/main/java/awesome/group/game/dao/mapper/WeGameUserMapper.java +++ b/game-dao/src/main/java/awesome/group/game/dao/mapper/WeGameUserMapper.java @@ -1,7 +1,6 @@ package awesome.group.game.dao.mapper; import awesome.group.game.dao.bean.WeGameUser; -import awesome.group.game.dao.bean.WxUserInfo; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; diff --git a/game-service/pom.xml b/game-service/pom.xml index 34507b0..b996ebf 100644 --- a/game-service/pom.xml +++ b/game-service/pom.xml @@ -62,6 +62,12 @@ okhttp + + + commons-lang + commons-lang + + diff --git a/game-service/src/main/java/awesome/group/game/service/UserService.java b/game-service/src/main/java/awesome/group/game/service/UserService.java deleted file mode 100644 index d115ddb..0000000 --- a/game-service/src/main/java/awesome/group/game/service/UserService.java +++ /dev/null @@ -1,16 +0,0 @@ -package awesome.group.game.service; - -import awesome.group.game.dao.bean.User; -import awesome.group.game.dao.mapper.UserMapper; -import jakarta.annotation.Resource; -import org.springframework.stereotype.Service; - -@Service -public class UserService { - @Resource - private UserMapper userMapper; - - public User getUser(Integer uid) { - return userMapper.selectById(uid); - } -} diff --git a/game-service/src/main/java/awesome/group/game/service/WxService.java b/game-service/src/main/java/awesome/group/game/service/WxService.java index 05c3dff..29d247e 100644 --- a/game-service/src/main/java/awesome/group/game/service/WxService.java +++ b/game-service/src/main/java/awesome/group/game/service/WxService.java @@ -2,23 +2,26 @@ package awesome.group.game.service; import awesome.group.game.dao.bean.GameApp; -import awesome.group.game.service.bo.CurrentUser; -import awesome.group.game.service.bo.RankList; -import awesome.group.game.service.bo.UserInfo; +import awesome.group.game.dao.bean.InviteRecord; +import awesome.group.game.dao.mapper.InviteRecordMapper; +import awesome.group.game.service.bo.*; import awesome.group.game.dao.bean.WeGameUser; -import awesome.group.game.dao.bean.WxUserInfo; +import awesome.group.game.service.bo.WxUserInfo; import awesome.group.game.dao.mapper.GameAppMapper; import awesome.group.game.dao.mapper.WeGameUserMapper; -import awesome.group.game.service.bo.Code2SessionBo; import awesome.group.game.service.common.exception.PaganiException; import awesome.group.game.service.common.exception.PaganiExceptionCode; import awesome.group.game.service.util.EncryptUtil; import awesome.group.game.service.util.HttpUtils; import awesome.group.game.service.util.JwtUtils; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.google.gson.Gson; import jakarta.annotation.Resource; +import org.apache.commons.lang.RandomStringUtils; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; import java.util.ArrayList; @@ -34,12 +37,39 @@ public class WxService { @Resource private GameAppMapper gameAppMapper; + @Resource + private InviteRecordMapper inviteRecordMapper; + public CurrentUser currentUser(Integer userId) { WeGameUser user = weGameUserMapper.selectById(userId); return new CurrentUser(user); } - public String login(String code, String appId) { + public void setInviteCode() { + List list = weGameUserMapper.selectList(Wrappers.emptyWrapper()); + list.forEach(x -> { + x.setInviteCode(RandomStringUtils.randomAlphanumeric(10)); + weGameUserMapper.updateById(x); + }); + + InviteRecord record = new InviteRecord(); + record.setUserId(1000003); + record.setInvitedUserId(1000001); + inviteRecordMapper.insert(record); + } + + public List myInviteRecord(Integer userId) { + List list = inviteRecordMapper.query(userId); + if (CollectionUtils.isEmpty(list)) { + return new ArrayList<>(); + } + LambdaQueryWrapper query = Wrappers.lambdaQuery(); + query.in(WeGameUser::getId, list); + List data = weGameUserMapper.selectList(query); + return data.stream().map(UserInfo::new).toList(); + } + + public WeGameUser login(String code, String appId) { Code2SessionBo data = getSession(code, appId); if (data == null || data.openid == null) { throw new PaganiException(PaganiExceptionCode.GENERAL_ERROR, "登陆失败,非法code"); @@ -51,13 +81,46 @@ public class WxService { u.setAppId(appId); u.setUnionId(data.unionid); u.setSessionKey(data.session_key); + u.setInviteCode(RandomStringUtils.randomAlphanumeric(10)); weGameUserMapper.insert(u); } else { weGameUserMapper.updateSessionKey(data.session_key, u.getId()); } + return u; + } + + public String loginV1(String code, String appId) { + WeGameUser u = login(code, appId); return JwtUtils.generatorToken(u.getId() + "", 20 * 86400); } + public LoginBo loginV2(String code, String appId, String inviteCode) { + WeGameUser u = login(code, appId); + LoginBo res = new LoginBo(); + res.inviteCode = u.getInviteCode(); + res.jwtToken = JwtUtils.generatorToken(u.getId() + "", 20 * 86400); + if (!StringUtils.hasText(inviteCode)) { + return res; + } + LambdaQueryWrapper query = Wrappers.lambdaQuery(); + query.eq(WeGameUser::getInviteCode, inviteCode); + WeGameUser user = weGameUserMapper.selectOne(query); + if (user == null || user.getId().equals(u.getId())) { + return res; + } + + LambdaQueryWrapper inviteQuery = Wrappers.lambdaQuery(); + inviteQuery.eq(InviteRecord::getInvitedUserId, u.getId()); + if (inviteRecordMapper.selectOne(inviteQuery) != null) { + return res; + } + InviteRecord record = new InviteRecord(); + record.userId = user.getId(); + record.invitedUserId = u.getId(); + inviteRecordMapper.insert(record); + return res; + } + public void updateUserInfo(Integer userId, String rawData, String signature) { if (!verify(userId, rawData, signature)) { throw new PaganiException(PaganiExceptionCode.GENERAL_ERROR, "签名有误"); @@ -82,7 +145,7 @@ public class WxService { List data = weGameUserMapper.queryTop(appId, size); List list = new ArrayList<>(); RankList res = new RankList(); - for(int i = 0; i < data.size(); i ++) { + for (int i = 0; i < data.size(); i++) { WeGameUser x = data.get(i); if (x.getId().equals(userId)) { res.myRank = (i + 1) + ""; diff --git a/game-service/src/main/java/awesome/group/game/service/bo/LoginBo.java b/game-service/src/main/java/awesome/group/game/service/bo/LoginBo.java new file mode 100644 index 0000000..f15168c --- /dev/null +++ b/game-service/src/main/java/awesome/group/game/service/bo/LoginBo.java @@ -0,0 +1,6 @@ +package awesome.group.game.service.bo; + +public class LoginBo { + public String jwtToken; + public String inviteCode; +} diff --git a/game-service/src/main/java/awesome/group/game/service/bo/UserInfo.java b/game-service/src/main/java/awesome/group/game/service/bo/UserInfo.java index 75c78cb..f56a697 100644 --- a/game-service/src/main/java/awesome/group/game/service/bo/UserInfo.java +++ b/game-service/src/main/java/awesome/group/game/service/bo/UserInfo.java @@ -1,5 +1,6 @@ package awesome.group.game.service.bo; +import awesome.group.game.dao.bean.WeGameUser; import lombok.Data; @Data @@ -7,4 +8,13 @@ public class UserInfo { public String avatarUrl; public String nickName; public Integer score; + + public UserInfo() { + } + + public UserInfo(WeGameUser user) { + this.avatarUrl = user.getAvatarUrl(); + this.nickName = user.getNickname(); + this.score = user.getScore(); + } } diff --git a/game-dao/src/main/java/awesome/group/game/dao/bean/WxUserInfo.java b/game-service/src/main/java/awesome/group/game/service/bo/WxUserInfo.java similarity index 87% rename from game-dao/src/main/java/awesome/group/game/dao/bean/WxUserInfo.java rename to game-service/src/main/java/awesome/group/game/service/bo/WxUserInfo.java index cbf150a..f68fc2f 100644 --- a/game-dao/src/main/java/awesome/group/game/dao/bean/WxUserInfo.java +++ b/game-service/src/main/java/awesome/group/game/service/bo/WxUserInfo.java @@ -1,4 +1,4 @@ -package awesome.group.game.dao.bean; +package awesome.group.game.service.bo; import lombok.Data; diff --git a/game-service/src/main/java/awesome/group/game/service/util/JwtUtils.java b/game-service/src/main/java/awesome/group/game/service/util/JwtUtils.java index 81837c0..5f00950 100644 --- a/game-service/src/main/java/awesome/group/game/service/util/JwtUtils.java +++ b/game-service/src/main/java/awesome/group/game/service/util/JwtUtils.java @@ -17,6 +17,10 @@ public class JwtUtils { private static final String JWT_KEY_USERID = "userId"; + public static void main(String[] args) { + System.out.println(generatorToken("1000001", 20 * 86400)); + } + public static String generatorToken(String userId, long expireSeconds) { LocalDateTime localDateTimeNow = LocalDateTime.now(); LocalDateTime localDateTimeExpire = localDateTimeNow.plusSeconds(expireSeconds); diff --git a/game-web/src/main/java/awesome/group/controller/LoginController.java b/game-web/src/main/java/awesome/group/controller/LoginController.java index 003a24a..8e796b3 100644 --- a/game-web/src/main/java/awesome/group/controller/LoginController.java +++ b/game-web/src/main/java/awesome/group/controller/LoginController.java @@ -4,11 +4,15 @@ import awesome.group.RequestContext; import awesome.group.aop.RestApi; import awesome.group.game.service.WxService; import awesome.group.game.service.bo.CurrentUser; +import awesome.group.game.service.bo.LoginBo; import awesome.group.game.service.bo.RankList; +import awesome.group.game.service.bo.UserInfo; import awesome.group.game.service.common.response.R; import jakarta.annotation.Resource; import org.springframework.web.bind.annotation.*; +import java.util.List; + @RestController @RequestMapping("/api/game/auth") public class LoginController { @@ -32,9 +36,30 @@ public class LoginController { @PostMapping("/login") @RestApi public R wxLogin(@RequestParam String code, @RequestParam String appId) { - return new R<>(R.CODE_SUCCESS, "", wxService.login(code, appId)); + return new R<>(R.CODE_SUCCESS, "", wxService.loginV1(code, appId)); + } + + @PostMapping("/loginV2") + @RestApi + public R wxLoginV2(@RequestParam String code, @RequestParam String appId, @RequestParam(required = false) String inviteCode) { + return new R<>(R.CODE_SUCCESS, "", wxService.loginV2(code, appId, inviteCode)); } + @GetMapping("/test") + @RestApi + public R setInviteCode() { + wxService.setInviteCode(); + return new R<>(R.CODE_SUCCESS, "", null); + } + + @GetMapping("/myInviteRecord") + @RestApi + public R> myInviteRecord() { + Integer userId = RequestContext.getUid(); + return new R<>(R.CODE_SUCCESS, "", wxService.myInviteRecord(userId)); + } + + /** * 更新用户信息 * 必须先登陆,需在login调用30分钟内 diff --git a/game-web/src/main/java/awesome/group/interceptor/InterceptorConfig.java b/game-web/src/main/java/awesome/group/interceptor/InterceptorConfig.java index 04b9395..190e071 100644 --- a/game-web/src/main/java/awesome/group/interceptor/InterceptorConfig.java +++ b/game-web/src/main/java/awesome/group/interceptor/InterceptorConfig.java @@ -21,6 +21,6 @@ public class InterceptorConfig implements WebMvcConfigurer { .addPathPatterns("/**") //不拦截的路径 .excludePathPatterns("/api/game/auth/login") - .excludePathPatterns("/api/game/user/demo"); + .excludePathPatterns("/api/game/auth/test"); } } diff --git a/pom.xml b/pom.xml index 5a7b098..e833d9a 100644 --- a/pom.xml +++ b/pom.xml @@ -45,6 +45,15 @@ 4.11.0 + + + commons-lang + commons-lang + 2.6 + + + +