feat: friends related logic refactor

This commit is contained in:
merlin
2025-12-02 10:09:57 +08:00
parent 0ea6e13064
commit 3fce5b2f01
14 changed files with 353 additions and 11 deletions

View File

@@ -35,7 +35,7 @@ public class JWTAuthenticationFilter extends OncePerRequestFilter {
try { try {
if (!jwtUtil.isTokenExpired(token)) { if (!jwtUtil.isTokenExpired(token)) {
System.out.println("token expired: " + token); // System.out.println("token expired: " + token);
String account = jwtUtil.getAccount(token); String account = jwtUtil.getAccount(token);
if (account != null && SecurityContextHolder.getContext().getAuthentication() == null) { if (account != null && SecurityContextHolder.getContext().getAuthentication() == null) {

View File

@@ -0,0 +1,67 @@
package xin.merlin.myplayerbackend.controller;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import xin.merlin.myplayerbackend.entity.Friends;
import xin.merlin.myplayerbackend.entity.UserInfo;
import xin.merlin.myplayerbackend.service.impl.FriendsServiceImpl;
import xin.merlin.myplayerbackend.service.impl.InvitingServiceImpl;
import xin.merlin.myplayerbackend.utils.JwtUtil;
import xin.merlin.myplayerbackend.utils.result.Response;
import xin.merlin.myplayerbackend.utils.result.ResultCode;
import static com.baomidou.mybatisplus.extension.ddl.DdlScriptErrorHandler.PrintlnLogErrorHandler.log;
@Slf4j
@RequestMapping("/friend")
@RestController
@RequiredArgsConstructor
public class FriendController {
private final FriendsServiceImpl friendsService;
private final InvitingServiceImpl invitingService;
private final JwtUtil jwtUtil;
@GetMapping("/get")
Response getFriend(@RequestHeader("Authorization")String token, @RequestParam Integer size, @RequestParam Integer page) {
try {
token = token.substring(7);
Integer id = jwtUtil.getId(token);
return Response.success(ResultCode.SUCCESS,friendsService.getFriends(id,size,page));
} catch (Exception e) {
log.error(e.getMessage());
return Response.fail(ResultCode.SERVER_ERROR);
}
}
@PostMapping("/delete")
Response deleteFriend(@RequestHeader("Authorization")String token, @RequestParam Integer f_id) {
try {
token = token.substring(7);
Integer id = jwtUtil.getId(token);
friendsService.removeFriend(id,f_id);
return Response.success(ResultCode.SUCCESS);
} catch (Exception e) {
log.error(e.getMessage());
return Response.fail(ResultCode.SERVER_ERROR);
}
}
@PostMapping("/nickname")
Response nickname(@RequestHeader("Authorization")String token, @RequestBody Friends friends) {
token = token.substring(7);
Integer id = jwtUtil.getId(token);
if (!id.equals(friends.getId())) return Response.success(ResultCode.SERVER_ERROR);
friendsService.saveOrUpdate(friends);
return Response.success(ResultCode.SUCCESS);
}
}

View File

@@ -0,0 +1,69 @@
package xin.merlin.myplayerbackend.controller;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import xin.merlin.myplayerbackend.entity.Inviting;
import xin.merlin.myplayerbackend.entity.UserInfo;
import xin.merlin.myplayerbackend.service.impl.InvitingServiceImpl;
import xin.merlin.myplayerbackend.utils.JwtUtil;
import xin.merlin.myplayerbackend.utils.result.Response;
import xin.merlin.myplayerbackend.utils.result.ResultCode;
import java.util.Map;
import java.util.Objects;
import static com.baomidou.mybatisplus.extension.ddl.DdlScriptErrorHandler.PrintlnLogErrorHandler.log;
@RequestMapping("/inviting")
@RestController
@RequiredArgsConstructor
public class InvitingController {
private final InvitingServiceImpl invitingService;
private final JwtUtil jwtUtil;
@PostMapping("/friends")
Response requestFriend(@RequestHeader("Authorization")String token, @RequestBody UserInfo userInfo) {
try {
token = token.substring(7);
Integer id = jwtUtil.getId(token);
if (Objects.equals(id, userInfo.getId())) return Response.success(ResultCode.INVITING_ILLEGAL_REQUEST);
if(invitingService.inviting(id,userInfo.getId(),null)) return Response.success(ResultCode.SUCCESS);
return Response.success(ResultCode.INVITING_REQUEST_ERROR);
} catch (Exception e) {
log.error(e.getMessage());
return Response.fail(ResultCode.SERVER_ERROR);
}
}
@GetMapping("/friends/get")
Response getFriend(@RequestHeader("Authorization")String token, @RequestParam Integer size, @RequestParam Integer page) {
try {
token = token.substring(7);
Integer id = jwtUtil.getId(token);
return Response.success(ResultCode.SUCCESS, invitingService.getInvitingDetail(id,size,page));
} catch (Exception e) {
log.error(e.getMessage());
return Response.fail(ResultCode.SERVER_ERROR);
}
}
@PostMapping("/friends/handle")
Response handleFriend(@RequestHeader("Authorization")String token, @RequestBody Inviting inviting) {
try {
token = token.substring(7);
Integer id = jwtUtil.getId(token);
if(!inviting.getTarget().equals(id)) return Response.success(ResultCode.INVITING_ILLEGAL_RESPONSE);
if(!invitingService.handleFriendInviting(inviting)) return Response.success(ResultCode.SERVER_ERROR);
return Response.success(ResultCode.SUCCESS);
} catch (Exception e) {
log.error(e.getMessage());
return Response.fail(ResultCode.SERVER_ERROR);
}
}
}

View File

@@ -3,6 +3,7 @@ package xin.merlin.myplayerbackend.controller;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import xin.merlin.myplayerbackend.entity.UserInfo; import xin.merlin.myplayerbackend.entity.UserInfo;
import xin.merlin.myplayerbackend.service.impl.UserServiceImpl; import xin.merlin.myplayerbackend.service.impl.UserServiceImpl;
@@ -10,8 +11,10 @@ import xin.merlin.myplayerbackend.utils.JwtUtil;
import xin.merlin.myplayerbackend.utils.result.Response; import xin.merlin.myplayerbackend.utils.result.Response;
import xin.merlin.myplayerbackend.utils.result.ResultCode; import xin.merlin.myplayerbackend.utils.result.ResultCode;
import java.util.Map;
import java.util.Objects; import java.util.Objects;
@Slf4j
@RestController @RestController
@RequestMapping("/user") @RequestMapping("/user")
@RequiredArgsConstructor @RequiredArgsConstructor
@@ -29,17 +32,42 @@ public class UserController {
@GetMapping("/info") @GetMapping("/info")
Response getInfo(@RequestHeader("Authorization")String token){ Response getInfo(@RequestHeader("Authorization")String token){
token = token.substring(7); try {
Integer id = jwtUtil.getId(token); token = token.substring(7);
return Response.success(ResultCode.SUCCESS,userService.getOne(Wrappers.<UserInfo>lambdaQuery().eq(UserInfo::getId,id))); Integer id = jwtUtil.getId(token);
return Response.success(ResultCode.SUCCESS,userService.getOne(Wrappers.<UserInfo>lambdaQuery().eq(UserInfo::getId,id)));
} catch (Exception e) {
log.error(e.getMessage());
return Response.fail(ResultCode.SERVER_ERROR);
}
} }
@PostMapping("/update") @PostMapping("/update")
Response updateInfo(@RequestHeader("Authorization")String token,@RequestBody UserInfo userinfo){ Response updateInfo(@RequestHeader("Authorization")String token,@RequestBody UserInfo userinfo){
if(!consistencyTest(token,userinfo.getId())) return Response.success(ResultCode.USER_ILLEGAL_REQUEST); try {
userService.updateById(userinfo); if(!consistencyTest(token,userinfo.getId())) return Response.success(ResultCode.USER_ILLEGAL_REQUEST);
return Response.success(ResultCode.SUCCESS); userService.updateById(userinfo);
return Response.success(ResultCode.SUCCESS);
} catch (Exception e) {
log.error(e.getMessage(),e);
return Response.fail(ResultCode.SERVER_ERROR);
}
}
@PostMapping("/search")
Response search(@RequestBody UserInfo userinfo){
try {
if(userinfo.getU_id()!=null){
return Response.success(ResultCode.SUCCESS, Map.of("result",userService.searchByUID(userinfo.getU_id())));
}
else
return Response.success(ResultCode.SUCCESS, Map.of("result",userService.searchByName(userinfo.getU_name())));
} catch (Exception e) {
log.error(e.getMessage(),e);
return Response.fail(ResultCode.SERVER_ERROR);
}
} }
} }

View File

@@ -2,10 +2,12 @@ package xin.merlin.myplayerbackend.entity;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
@Data @Data
@TableName("friends") @TableName("friends")
@AllArgsConstructor
public class Friends { public class Friends {
private Integer id; private Integer id;
private Integer f_id; private Integer f_id;

View File

@@ -13,6 +13,7 @@ public class Inviting {
private Integer inviter; private Integer inviter;
private Integer target; private Integer target;
// 0 表示未处理 1 表示同意 2 表示拒绝
private Integer status; private Integer status;
private Integer room; private Integer room;
} }

View File

@@ -0,0 +1,24 @@
package xin.merlin.myplayerbackend.entity.http;
import lombok.Data;
import xin.merlin.myplayerbackend.entity.UserInfo;
@Data
public class Friend {
private String u_id;
private Integer id;
private String u_name;
private String u_introduction;
private String u_avatar;
private String nickname;
public Friend(UserInfo userInfo,String nickname) {
this.id = userInfo.getId();
this.u_id = userInfo.getU_id();
this.u_name = userInfo.getU_name();
this.u_introduction = userInfo.getU_introduction();
this.u_avatar = userInfo.getU_avatar();
this.nickname = nickname;
}
}

View File

@@ -0,0 +1,31 @@
package xin.merlin.myplayerbackend.entity.http;
import lombok.Data;
import lombok.NoArgsConstructor;
import xin.merlin.myplayerbackend.entity.Inviting;
import xin.merlin.myplayerbackend.entity.UserInfo;
@Data
@NoArgsConstructor
public class InvitingDetails {
private Integer i_id;
private Integer inviter;
private String inviter_name;
private String inviter_avatar;
private Integer target;
// 0 表示未处理 1 表示已处理
private Integer status;
private Integer room;
public InvitingDetails(Inviting inviting, UserInfo userInfo) {
this.i_id = inviting.getI_id();
this.inviter = inviting.getInviter();
this.target = inviting.getTarget();
this.status = inviting.getStatus();
this.room = inviting.getRoom();
this.inviter_name = userInfo.getU_name();
this.inviter_avatar = userInfo.getU_avatar();
}
}

View File

@@ -69,9 +69,9 @@ public class LoginService{
u.setU_id(RandomCode.generateID()); u.setU_id(RandomCode.generateID());
}while (userMapper.selectById(u.getU_id())!=null); }while (userMapper.selectById(u.getU_id())!=null);
userMapper.insert(u); userMapper.insert(u);
u = userMapper.selectById(u.getId()); u = userMapper.selectById(u.getU_id());
codeService.getWaitingList().invalidate(code.getC_id()); codeService.getWaitingList().invalidate(code.getC_id());
return Response.success(ResultCode.SUCCESS,Map.of("token",jwtUtil.generateToken(account),"userinfo",u)); return Response.success(ResultCode.SUCCESS,Map.of("token",jwtUtil.generateToken(account),"token_type","Bearer","userinfo",u));
} }
return response; return response;
} catch (Exception e) { } catch (Exception e) {

View File

@@ -1,10 +1,47 @@
package xin.merlin.myplayerbackend.service.impl; package xin.merlin.myplayerbackend.service.impl;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import xin.merlin.myplayerbackend.entity.Friends; import xin.merlin.myplayerbackend.entity.Friends;
import xin.merlin.myplayerbackend.entity.UserInfo;
import xin.merlin.myplayerbackend.entity.http.Friend;
import xin.merlin.myplayerbackend.mapper.FriendsMapper; import xin.merlin.myplayerbackend.mapper.FriendsMapper;
import xin.merlin.myplayerbackend.mapper.UserMapper;
import java.util.ArrayList;
import java.util.List;
@Service @Service
@RequiredArgsConstructor
public class FriendsServiceImpl extends ServiceImpl<FriendsMapper, Friends> { public class FriendsServiceImpl extends ServiceImpl<FriendsMapper, Friends> {
private final FriendsMapper friendsMapper;
private final UserMapper userMapper;
public List<Friend> getFriends(Integer id, Integer size, Integer page) {
List<Friends> friends = friendsMapper.selectList(new Page<>(page,size),Wrappers.<Friends>lambdaQuery().eq(Friends::getId, id));
List<Friend> fs = new ArrayList<>();
for (Friends f : friends) {
fs.add(new Friend(userMapper.selectOne(Wrappers.<UserInfo>lambdaQuery().eq(UserInfo::getId,f.getF_id())),f.getNickname()));
}
return fs;
}
@Transactional
public void removeFriend(Integer id, Integer f_id) {
try {
friendsMapper.delete(Wrappers.<Friends>lambdaQuery().eq(Friends::getF_id,f_id).eq(Friends::getId,id));
friendsMapper.delete(Wrappers.<Friends>lambdaQuery().eq(Friends::getF_id,id).eq(Friends::getId,f_id));
} catch (Exception e) {
throw new RuntimeException(e);
}
}
} }

View File

@@ -1,10 +1,71 @@
package xin.merlin.myplayerbackend.service.impl; package xin.merlin.myplayerbackend.service.impl;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import xin.merlin.myplayerbackend.entity.Friends;
import xin.merlin.myplayerbackend.entity.Inviting; import xin.merlin.myplayerbackend.entity.Inviting;
import xin.merlin.myplayerbackend.entity.UserInfo;
import xin.merlin.myplayerbackend.entity.http.InvitingDetails;
import xin.merlin.myplayerbackend.mapper.FriendsMapper;
import xin.merlin.myplayerbackend.mapper.InvitingMapper; import xin.merlin.myplayerbackend.mapper.InvitingMapper;
import xin.merlin.myplayerbackend.mapper.UserMapper;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@Service @Service
@RequiredArgsConstructor
public class InvitingServiceImpl extends ServiceImpl<InvitingMapper, Inviting> { public class InvitingServiceImpl extends ServiceImpl<InvitingMapper, Inviting> {
private final InvitingMapper invitingMapper;
private final UserMapper userMapper;
private final FriendsMapper friendsMapper;
public Boolean inviting(Integer inviter, Integer target,Integer room){
Inviting inviting = new Inviting();
inviting.setInviter(inviter);
inviting.setTarget(target);
inviting.setStatus(0);
if (room != null){
inviting.setRoom(room);
}
if (invitingMapper.selectCount(Wrappers.<Inviting>lambdaQuery().eq(Inviting::getInviter,inviter).eq(Inviting::getTarget,target).eq(Inviting::getStatus,0).eq(Inviting::getRoom,room)) > 0) return false;
return invitingMapper.insert(inviting) == 1;
}
public Map<String,Object> getInvitingDetail(Integer target, Integer size, Integer page){
List<Inviting> invitings = invitingMapper.selectList(new Page<Inviting>(page,size), Wrappers.<Inviting>lambdaQuery().eq(Inviting::getTarget,target));
List<InvitingDetails> invitingDetails = new ArrayList<>();
for (Inviting inviting : invitings){
InvitingDetails invitingDetail = new InvitingDetails(inviting,
userMapper.selectOne(Wrappers.<UserInfo>lambdaQuery().eq(UserInfo::getId,target)));
invitingDetails.add(invitingDetail);
}
return Map.of("result",invitingDetails);
}
@Transactional
public Boolean handleFriendInviting(Inviting inviting) {
try {
if (inviting.getStatus().equals(0)) return false;
else if (inviting.getStatus().equals(1)){
friendsMapper.insert(new Friends(inviting.getInviter(), inviting.getTarget(), null));
friendsMapper.insert(new Friends(inviting.getTarget(), inviting.getInviter(), null));
return true;
}
else return true;
} catch (Exception e) {
log.error(e.getMessage());
throw new RuntimeException(e);
}
}
} }

View File

@@ -1,10 +1,26 @@
package xin.merlin.myplayerbackend.service.impl; package xin.merlin.myplayerbackend.service.impl;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import xin.merlin.myplayerbackend.entity.UserInfo; import xin.merlin.myplayerbackend.entity.UserInfo;
import xin.merlin.myplayerbackend.mapper.UserMapper; import xin.merlin.myplayerbackend.mapper.UserMapper;
@Service @Service
@RequiredArgsConstructor
public class UserServiceImpl extends ServiceImpl<UserMapper, UserInfo> { public class UserServiceImpl extends ServiceImpl<UserMapper, UserInfo> {
private final UserMapper userMapper;
public Object searchByUID(String u_id) {
Page<UserInfo> page = new Page<>(1, 5);
return userMapper.selectList(page,Wrappers.<UserInfo>lambdaQuery().like(UserInfo::getU_id, u_id));
}
public Object searchByName(String u_name) {
Page<UserInfo> page = new Page<>(1, 5);
return userMapper.selectList(page,Wrappers.<UserInfo>lambdaQuery().like(UserInfo::getU_name, u_name));
}
} }

View File

@@ -76,7 +76,7 @@ public class JwtUtil {
private Claims getClaims(String token) { private Claims getClaims(String token) {
try { try {
Jws<Claims> jws = jwtParser.parseSignedClaims(token); Jws<Claims> jws = jwtParser.parseSignedClaims(token);
System.out.println(jws.getPayload()); // System.out.println(jws.getPayload());
return jws.getPayload(); return jws.getPayload();
} catch (ExpiredJwtException e) { } catch (ExpiredJwtException e) {
throw new TokenExpiredException("Token 已过期", e); throw new TokenExpiredException("Token 已过期", e);

View File

@@ -45,7 +45,13 @@ public enum ResultCode {
MAIL_VERIFY_CODE_ERROR("4106","验证码错误,请重新输入"), MAIL_VERIFY_CODE_ERROR("4106","验证码错误,请重新输入"),
//审核相关 //审核相关
AUDIT_NO_RECORD("4201","无审核记录条目"); AUDIT_NO_RECORD("4201","无审核记录条目"),
//邀请相关
INVITING_REQUEST_ERROR("4301","邀请请求错误"),
INVITING_ILLEGAL_REQUEST("4302","非法邀请"),
INVITING_ILLEGAL_RESPONSE("4303","非法邀请");