jc vor 1 Tag
Ursprung
Commit
4cd5fb7ee3
26 geänderte Dateien mit 623 neuen und 27 gelöschten Zeilen
  1. 5 6
      pom.xml
  2. 60 0
      src/main/java/com/neko/controller/FriendController.java
  3. 25 0
      src/main/java/com/neko/controller/MessageController.java
  4. 29 1
      src/main/java/com/neko/controller/UserController.java
  5. 16 0
      src/main/java/com/neko/domain/dto/friendDto/FriendDto.java
  6. 17 0
      src/main/java/com/neko/domain/dto/friendDto/FriendTongDto.java
  7. 14 0
      src/main/java/com/neko/domain/dto/friendDto/UserPwdDto.java
  8. 14 0
      src/main/java/com/neko/domain/dto/messageDto/SendMessageContentDto.java
  9. 7 4
      src/main/java/com/neko/domain/pojo/FriendRelation.java
  10. 5 4
      src/main/java/com/neko/domain/pojo/FriendRequest.java
  11. 3 0
      src/main/java/com/neko/domain/pojo/User.java
  12. 2 2
      src/main/java/com/neko/domain/pojo/UserLog.java
  13. 16 0
      src/main/java/com/neko/domain/vo/RequestFriendVo.java
  14. 4 1
      src/main/java/com/neko/mapper/FriendRelationMapper.java
  15. 9 0
      src/main/java/com/neko/service/FriendRelationService.java
  16. 3 0
      src/main/java/com/neko/service/MessageService.java
  17. 10 1
      src/main/java/com/neko/service/UserService.java
  18. 122 0
      src/main/java/com/neko/service/impl/FriendRelationServiceImpl.java
  19. 7 0
      src/main/java/com/neko/service/impl/MessageServiceImpl.java
  20. 163 4
      src/main/java/com/neko/service/impl/UserServiceImpl.java
  21. 7 1
      src/main/java/com/neko/utils/ApiServiceExceptionEnum.java
  22. 34 0
      src/main/java/com/neko/utils/OrderNumber.java
  23. 32 0
      src/main/java/com/neko/utils/UserThreadLocalhostUtil.java
  24. 2 0
      src/main/resources/application.yml
  25. 5 0
      src/main/resources/mapper/FriendRelationMapper.xml
  26. 12 3
      src/test/java/com/neko/NekomimiApplicationTests.java

+ 5 - 6
pom.xml

@@ -37,7 +37,7 @@
         <dependency>
             <groupId>com.baomidou</groupId>
             <artifactId>mybatis-plus-boot-starter</artifactId>
-            <version>3.5.4</version>
+            <version>3.5.9</version>
         </dependency>
 
         <dependency>
@@ -94,11 +94,10 @@
             <optional>true</optional>
         </dependency>
 
-<!--        <dependency>-->
-<!--            <groupId>com.xkcoding.justauth</groupId>-->
-<!--            <artifactId>justauth-spring-boot-starter</artifactId>-->
-<!--            <version>1.4.0</version>-->
-<!--        </dependency>-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-websocket</artifactId>
+        </dependency>
 
     </dependencies>
     <dependencyManagement>

+ 60 - 0
src/main/java/com/neko/controller/FriendController.java

@@ -0,0 +1,60 @@
+package com.neko.controller;
+
+import com.neko.domain.dto.friendDto.FriendDto;
+import com.neko.domain.dto.friendDto.FriendTongDto;
+import com.neko.domain.vo.RequestFriendVo;
+import com.neko.mapper.FriendRequestMapper;
+import com.neko.service.FriendRelationService;
+import com.neko.service.FriendRequestService;
+import com.neko.utils.ResultVo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.net.InetAddress;
+
+/**
+ * @Date 2025/5/19 18:52
+ * @Author neko
+ **/
+@RestController
+@RequestMapping("/friend")
+public class FriendController {
+    @Autowired
+    FriendRelationService friendRelationService;
+    @Autowired
+    FriendRequestService friendRequestService;
+
+    /**
+     * 添加好友
+     * @param dto
+     * @return
+     */
+    @RequestMapping("addFriend")
+    public ResultVo addFriend(@RequestBody FriendDto dto)throws Exception{
+        return friendRelationService.addFriend(dto);
+    }
+
+    /**
+     * 处理好友请求
+     * @param dto
+     * @return
+     * @throws Exception
+     */
+    @RequestMapping("handle_friend_http")
+    public ResultVo handleFriendHttp(@RequestBody FriendTongDto dto) throws Exception{
+        return friendRelationService.handleFriendHttp(dto);
+    }
+
+    /**
+     * 查询我的好友
+     * @param requestFriend
+     * @return
+     */
+    @RequestMapping("find_friend_list")
+    public ResultVo findFriendList(@RequestBody RequestFriendVo requestFriend){
+        return friendRelationService.findFriendList(requestFriend);
+    }
+
+}

+ 25 - 0
src/main/java/com/neko/controller/MessageController.java

@@ -0,0 +1,25 @@
+package com.neko.controller;
+
+import com.neko.domain.dto.messageDto.SendMessageContentDto;
+import com.neko.service.MessageService;
+import com.neko.utils.ResultVo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @Date 2025/5/21 9:49
+ * @Author neko
+ **/
+@RestController
+@RequestMapping("/message")
+public class MessageController {
+    @Autowired
+    MessageService messageService;
+
+    @RequestMapping("sendMessage")
+    public ResultVo sendMessage(SendMessageContentDto dto){
+        return messageService.sendMessage(dto);
+    }
+
+}

+ 29 - 1
src/main/java/com/neko/controller/UserController.java

@@ -1,6 +1,7 @@
 package com.neko.controller;
 
 import com.alibaba.fastjson2.JSON;
+import com.neko.domain.dto.friendDto.UserPwdDto;
 import com.neko.domain.dto.userDto.PhoneLoginDto;
 import com.neko.domain.dto.userDto.YanDto;
 import com.neko.service.UserService;
@@ -30,7 +31,7 @@ public class UserController {
      * @return
      */
     @RequestMapping("phoen_login")
-    public ResultVo phoenLogin(@RequestBody PhoneLoginDto phoneLoginDto){
+    public ResultVo phoenLogin(@RequestBody PhoneLoginDto phoneLoginDto) throws Exception {
         return userService.phoenLogin(phoneLoginDto);
     }
 
@@ -94,6 +95,33 @@ public class UserController {
          */
         // 2、拿到 access_token 以后发送一个get 请求,获取用户信息
         String userInfo = userService.getUserInfo(loginType, thirdlyResult.getAccessToken());
+
         return userInfo;
     }
+
+    /**
+     * 退出登录
+     * @param token
+     * @return
+     * @throws Exception
+     */
+    @RequestMapping("logout")
+    public ResultVo logout(String token)throws Exception{
+        return userService.logout(token);
+    }
+
+    /**
+     * 查询个人用户信息
+     * @param token
+     * @return
+     */
+    @RequestMapping("myUserData")
+    public ResultVo myUserData(@RequestParam("token") String token){
+        return userService.myUserData(token);
+    }
+
+    @RequestMapping("updapeUserPwd")
+    public ResultVo updapeUserPwd(@RequestBody UserPwdDto dto){
+        return userService.updapeUserPwd(dto);
+    }
 }

+ 16 - 0
src/main/java/com/neko/domain/dto/friendDto/FriendDto.java

@@ -0,0 +1,16 @@
+package com.neko.domain.dto.friendDto;
+
+import lombok.Data;
+
+/**
+ * @Date 2025/5/19 18:58
+ * @Author neko
+ **/
+@Data
+public class FriendDto {
+    private String sendToken;//发送者token
+    private String jiePhone;//接收者手机号(通过手机号查出ID)
+    private String message;//请求消息
+    private String remark;//好友备注
+    private String groupName;//好友分组
+}

+ 17 - 0
src/main/java/com/neko/domain/dto/friendDto/FriendTongDto.java

@@ -0,0 +1,17 @@
+package com.neko.domain.dto.friendDto;
+
+import lombok.Data;
+
+/**
+ * @Date 2025/5/19 21:40
+ * @Author neko
+ **/
+@Data
+public class FriendTongDto {
+    private String sendToken;//发送者token
+    private String jiePhone;//接收者手机号(通过手机号查出ID)
+    private String message;//请求消息
+    private String remark;//好友备注
+    private String groupName;//好友分组
+    private Integer status;
+}

+ 14 - 0
src/main/java/com/neko/domain/dto/friendDto/UserPwdDto.java

@@ -0,0 +1,14 @@
+package com.neko.domain.dto.friendDto;
+
+import lombok.Data;
+
+/**
+ * @Date 2025/5/21 14:19
+ * @Author neko
+ **/
+@Data
+public class UserPwdDto {
+    private String token;
+    private String password;
+    private String smsCode;
+}

+ 14 - 0
src/main/java/com/neko/domain/dto/messageDto/SendMessageContentDto.java

@@ -0,0 +1,14 @@
+package com.neko.domain.dto.messageDto;
+
+import lombok.Data;
+import org.springframework.web.multipart.MultipartFile;
+
+/**
+ * @Date 2025/5/21 10:11
+ * @Author neko
+ **/
+@Data
+public class SendMessageContentDto {
+    private String senderId;
+    private String receiverType;
+}

+ 7 - 4
src/main/java/com/neko/domain/pojo/FriendRelation.java

@@ -1,9 +1,7 @@
 package com.neko.domain.pojo;
 
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.*;
+
 import java.io.Serializable;
 import java.util.Date;
 import lombok.Data;
@@ -51,6 +49,8 @@ public class FriendRelation implements Serializable {
      */
     private Integer isMute;
 
+    private Integer status;
+
     /**
      * 创建时间
      */
@@ -61,6 +61,9 @@ public class FriendRelation implements Serializable {
      */
     private Date updateTime;
 
+    @TableLogic(value = "1",delval = "2")
+    private Integer deleted;
+
     @TableField(exist = false)
     private static final long serialVersionUID = 1L;
 }

+ 5 - 4
src/main/java/com/neko/domain/pojo/FriendRequest.java

@@ -1,9 +1,7 @@
 package com.neko.domain.pojo;
 
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.*;
+
 import java.io.Serializable;
 import java.util.Date;
 import lombok.Data;
@@ -51,6 +49,9 @@ public class FriendRequest implements Serializable {
      */
     private Date handledTime;
 
+    @TableLogic(value = "1",delval = "2")
+    private Integer deleted;
+
     @TableField(exist = false)
     private static final long serialVersionUID = 1L;
 }

+ 3 - 0
src/main/java/com/neko/domain/pojo/User.java

@@ -75,4 +75,7 @@ public class User implements Serializable {
 
     @TableField(exist = false)
     private static final long serialVersionUID = 1L;
+
+    @TableField(exist = false)
+    private UserProfile profiles;
 }

+ 2 - 2
src/main/java/com/neko/domain/pojo/UserLog.java

@@ -18,7 +18,7 @@ public class UserLog implements Serializable {
     /**
      *
      */
-    @TableId
+    @TableId(type = IdType.AUTO)
     private Integer id;
 
     /**
@@ -49,7 +49,7 @@ public class UserLog implements Serializable {
     /**
      * 操作描述
      */
-    private String describe;
+    private String describes;
 
     /**
      * 登出时间

+ 16 - 0
src/main/java/com/neko/domain/vo/RequestFriendVo.java

@@ -0,0 +1,16 @@
+package com.neko.domain.vo;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import lombok.Data;
+
+/**
+ * @Date 2025/5/20 10:00
+ * @Author neko
+ **/
+@Data
+public class RequestFriendVo {
+    private String token;
+
+    @TableField(exist = false)
+    private String id;
+}

+ 4 - 1
src/main/java/com/neko/mapper/FriendRelationMapper.java

@@ -2,6 +2,9 @@ package com.neko.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.neko.domain.pojo.FriendRelation;
+import com.neko.domain.vo.RequestFriendVo;
+
+import java.util.List;
 
 /**
 * @author 金聪
@@ -10,7 +13,7 @@ import com.neko.domain.pojo.FriendRelation;
 * @Entity com.neko.domain.FriendRelation
 */
 public interface FriendRelationMapper extends BaseMapper<FriendRelation> {
-
+    List<FriendRelation> findFriendList(RequestFriendVo requestFriend);
 }
 
 

+ 9 - 0
src/main/java/com/neko/service/FriendRelationService.java

@@ -1,7 +1,11 @@
 package com.neko.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.neko.domain.dto.friendDto.FriendDto;
+import com.neko.domain.dto.friendDto.FriendTongDto;
 import com.neko.domain.pojo.FriendRelation;
+import com.neko.domain.vo.RequestFriendVo;
+import com.neko.utils.ResultVo;
 
 /**
 * @author 金聪
@@ -10,4 +14,9 @@ import com.neko.domain.pojo.FriendRelation;
 */
 public interface FriendRelationService extends IService<FriendRelation> {
 
+    ResultVo addFriend(FriendDto dto);
+
+    ResultVo handleFriendHttp(FriendTongDto dto);
+
+    ResultVo findFriendList(RequestFriendVo requestFriend);
 }

+ 3 - 0
src/main/java/com/neko/service/MessageService.java

@@ -1,7 +1,9 @@
 package com.neko.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.neko.domain.dto.messageDto.SendMessageContentDto;
 import com.neko.domain.pojo.Message;
+import com.neko.utils.ResultVo;
 
 /**
 * @author 金聪
@@ -10,4 +12,5 @@ import com.neko.domain.pojo.Message;
 */
 public interface MessageService extends IService<Message> {
 
+    ResultVo sendMessage(SendMessageContentDto dto);
 }

+ 10 - 1
src/main/java/com/neko/service/UserService.java

@@ -1,11 +1,14 @@
 package com.neko.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.neko.domain.dto.friendDto.UserPwdDto;
 import com.neko.domain.dto.userDto.PhoneLoginDto;
 import com.neko.domain.dto.userDto.YanDto;
 import com.neko.domain.pojo.User;
 import com.neko.utils.ResultVo;
 
+import java.net.UnknownHostException;
+
 /**
 * @author 金聪
 * @description 针对表【user(用户表)】的数据库操作Service
@@ -13,7 +16,7 @@ import com.neko.utils.ResultVo;
 */
 public interface UserService extends IService<User> {
 
-    ResultVo phoenLogin(PhoneLoginDto phoneLoginDto);
+    ResultVo phoenLogin(PhoneLoginDto phoneLoginDto) throws Exception;
 
     ResultVo yan(YanDto dto);
 
@@ -39,4 +42,10 @@ public interface UserService extends IService<User> {
      * @return
      */
     String getUserInfo(String loginType,String accessToken);
+
+    ResultVo logout(String token) throws Exception;
+
+    ResultVo myUserData(String token);
+
+    ResultVo updapeUserPwd(UserPwdDto dto);
 }

+ 122 - 0
src/main/java/com/neko/service/impl/FriendRelationServiceImpl.java

@@ -1,20 +1,142 @@
 package com.neko.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.neko.domain.dto.friendDto.FriendDto;
+import com.neko.domain.dto.friendDto.FriendTongDto;
 import com.neko.domain.pojo.FriendRelation;
+import com.neko.domain.pojo.FriendRequest;
+import com.neko.domain.pojo.User;
+import com.neko.domain.vo.RequestFriendVo;
+import com.neko.mapper.FriendRequestMapper;
+import com.neko.mapper.UserMapper;
 import com.neko.service.FriendRelationService;
 import com.neko.mapper.FriendRelationMapper;
+import com.neko.utils.*;
+import io.jsonwebtoken.Claims;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.Date;
+import java.util.List;
+
 /**
 * @author 金聪
 * @description 针对表【friend_relation(好友关系表)】的数据库操作Service实现
 * @createDate 2025-05-18 20:59:28
 */
 @Service
+@Slf4j
 public class FriendRelationServiceImpl extends ServiceImpl<FriendRelationMapper, FriendRelation>
     implements FriendRelationService{
+    @Autowired
+    FriendRelationMapper friendRelationMapper;
+    @Autowired
+    FriendRequestMapper friendRequestMapper;
+    @Autowired
+    UserMapper userMapper;
+
+    @Override
+    public ResultVo addFriend(FriendDto dto) {
+        if(dto.getSendToken()==null || dto.getJiePhone()==null){
+            log.info("添加朋友");
+            return ResultVo.error(ApiServiceExceptionEnum.SHUJU_NOT_NULL);
+        }
+        //发送好友请求
+        Claims claims = AppJwtUtil.getClaimsBody(dto.getSendToken());
+        String id = claims.get("id").toString();
+        System.err.println(id);
+        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(User::getPhone,dto.getJiePhone());
+        User user = userMapper.selectOne(queryWrapper);
+
+        FriendRequest request = new FriendRequest();
+        request.setId(String.valueOf(SnowflakeUtil.nextId()));
+        request.setSenderId(id);
+        request.setReceiverId(user.getId());
+        request.setMessage(dto.getMessage());
+        request.setCreateTime(new Date());
+        int i = friendRequestMapper.insert(request);
+        if(i!=1){
+            log.info("好友请求 发送失败");
+            return ResultVo.error(ApiServiceExceptionEnum.RESULT_ERROR);
+        }
+        //添加好友信息
+        FriendRelation relation = new FriendRelation();
+        relation.setId(String.valueOf(SnowflakeUtil.nextId()));
+        relation.setUserId(id);
+        relation.setFriendId(user.getId());
+        relation.setRemark(dto.getRemark());
+        relation.setGroupName(dto.getGroupName());
+        relation.setCreateTime(new Date());
+        friendRelationMapper.insert(relation);
+
+        return ResultVo.success(ApiServiceExceptionEnum.Friend_ADD_OK);
+    }
+
+    @Override
+    public ResultVo handleFriendHttp(FriendTongDto dto) {
+        if(dto.getSendToken()==null || dto.getJiePhone()==null){
+            log.info("同意请求");
+            return ResultVo.error(ApiServiceExceptionEnum.SHUJU_NOT_NULL);
+        }
+
+        Claims claims = AppJwtUtil.getClaimsBody(dto.getSendToken());
+        String id = claims.get("id").toString();
+        Long iid = Long.valueOf(id);
+        QueryWrapper<FriendRequest> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(FriendRequest::getReceiverId,iid)
+                .eq(FriendRequest::getStatus,0);
+        FriendRequest request = friendRequestMapper.selectOne(queryWrapper);
+        request.setStatus(dto.getStatus());
+
+        //查询发起请求者的ID
+        QueryWrapper<User> wrapper = new QueryWrapper<>();
+        wrapper.lambda().eq(User::getPhone,dto.getJiePhone());
+        User user = userMapper.selectOne(wrapper);
+
+        //
+        QueryWrapper<FriendRelation> query = new QueryWrapper<>();
+        query.lambda().eq(FriendRelation::getUserId,user.getId());
+        FriendRelation friendRelation = friendRelationMapper.selectOne(query);
+        friendRelation.setStatus(1);
+
+        FriendRelation relation = new FriendRelation();
+        relation.setId(String.valueOf(SnowflakeUtil.nextId()));
+        relation.setUserId(id);
+        relation.setFriendId(user.getId());
+        relation.setRemark(dto.getRemark());
+        relation.setGroupName(dto.getGroupName());
+        relation.setStatus(1);
+        relation.setCreateTime(new Date());
+
+        friendRequestMapper.updateById(request);
+        if(dto.getStatus()==1){
+            log.info("同意好友请求");
+            friendRelationMapper.updateById(friendRelation);
+            friendRelationMapper.insert(relation);
+            friendRelationMapper.deleteById(user.getId());
+            return ResultVo.success(ApiServiceExceptionEnum.RESULT_SUCCES);
+        }else if(dto.getStatus()==2){
+            log.info("已拒绝好友请求");
+            return ResultVo.success(ApiServiceExceptionEnum.Friend_JUJUE);
+        }else {
+            return ResultVo.error(ApiServiceExceptionEnum.RESULT_ERROR);
+        }
+    }
+
+    @Override
+    public ResultVo findFriendList(RequestFriendVo requestFriend) {
+        Claims claims = AppJwtUtil.getClaimsBody(requestFriend.getToken());
+        String id = claims.get("id").toString();
+        requestFriend.setId(id);
+
+        List<FriendRelation> list = friendRelationMapper.findFriendList(requestFriend);
+//        System.err.println(list);
 
+        return ResultVo.success(ApiServiceExceptionEnum.RESULT_SUCCES,list);
+    }
 }
 
 

+ 7 - 0
src/main/java/com/neko/service/impl/MessageServiceImpl.java

@@ -1,9 +1,11 @@
 package com.neko.service.impl;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.neko.domain.dto.messageDto.SendMessageContentDto;
 import com.neko.domain.pojo.Message;
 import com.neko.service.MessageService;
 import com.neko.mapper.MessageMapper;
+import com.neko.utils.ResultVo;
 import org.springframework.stereotype.Service;
 
 /**
@@ -15,6 +17,11 @@ import org.springframework.stereotype.Service;
 public class MessageServiceImpl extends ServiceImpl<MessageMapper, Message>
     implements MessageService{
 
+    @Override
+    public ResultVo sendMessage(SendMessageContentDto dto) {
+
+        return null;
+    }
 }
 
 

+ 163 - 4
src/main/java/com/neko/service/impl/UserServiceImpl.java

@@ -2,15 +2,23 @@ package com.neko.service.impl;
 
 import cn.hutool.http.HttpUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.repository.AbstractRepository;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.neko.config.GiteeProperties;
 import com.neko.config.ThirdlyLoginTypeConstant;
+import com.neko.domain.dto.friendDto.UserPwdDto;
 import com.neko.domain.dto.userDto.PhoneLoginDto;
 import com.neko.domain.dto.userDto.YanDto;
 import com.neko.domain.pojo.User;
+import com.neko.domain.pojo.UserDevice;
+import com.neko.domain.pojo.UserLog;
+import com.neko.domain.pojo.UserProfile;
+import com.neko.mapper.UserLogMapper;
+import com.neko.mapper.UserProfileMapper;
 import com.neko.service.UserService;
 import com.neko.mapper.UserMapper;
 import com.neko.utils.*;
+import io.jsonwebtoken.Claims;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.http.HttpResponse;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -19,8 +27,11 @@ import org.springframework.stereotype.Service;
 import org.springframework.util.DigestUtils;
 import org.springframework.util.StringUtils;
 
+import java.net.InetAddress;
+import java.net.UnknownHostException;
 import java.nio.charset.StandardCharsets;
 import java.util.*;
+import java.util.concurrent.TimeUnit;
 
 /**
 * @author 金聪
@@ -37,23 +48,32 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User>
     private RedisTemplate redisTemplate;
     @Autowired
     GiteeProperties giteeProperties;
+    @Autowired
+    UserProfileMapper userProfileMapper;
+    @Autowired
+    UserLogMapper userLogMapper;
 
     @Override
-    public ResultVo phoenLogin(PhoneLoginDto dto) {
+    public ResultVo phoenLogin(PhoneLoginDto dto) throws Exception {
         //判断手机号是否正确
         if(StringUtils.isEmpty(dto.getPhone())){
+            log.info("手机号不能为空");
             return ResultVo.error(ApiServiceExceptionEnum.USER_NOT_NULL);
         }
+        InetAddress localHost = null;
+        localHost = InetAddress.getLocalHost();
         if(StringUtils.isEmpty(dto.getPassword())){
             log.info("验证码登录");
             if(StringUtils.isEmpty(dto.getSmsCode())){
                 //判断验证码是否为空
+                log.info("验证码不能为空");
                 return ResultVo.error(ApiServiceExceptionEnum.YAN_NOT_NULL);
             }
             //从reids中获取验证码
             String yan = (String) redisTemplate.opsForValue().get("yan");
             if(!yan.equals(dto.getSmsCode())){
                 //判断验证码是否正确
+                log.info("验证码错误");
                 return ResultVo.error(ApiServiceExceptionEnum.YAN_ERROR);
             }
             QueryWrapper<User> queryWrapper = new QueryWrapper<>();
@@ -80,14 +100,63 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User>
                 u.setUsername("PTYH"+dto.getPhone());
                 u.setCreateTime(new Date());
                 userMapper.insert(u);
+                //添加用户信息
+                log.info("添加用户信息");
+                UserProfile userProfile = new UserProfile();
+                userProfile.setId(String.valueOf(SnowflakeUtil.nextId()));
+                userProfile.setUserId(u.getId());
+                userProfile.setNickname(u.getUsername());
+                userProfile.setAvatar("http://47.95.170.81:19000/loli/bf4e13220f87c5e68e058da3f7dc48b.png");
+                userProfile.setCreateTime(new Date());
+                userProfileMapper.insert(userProfile);
+                //添加用户设备信息
+//                log.info("添加用户设备信息");
+//                UserDevice device = new UserDevice();
+//                device.setId(String.valueOf(SnowflakeUtil.nextId()));
+//                device.setUserId(u.getId());
+//                device.setDeviceId(UUID.randomUUID().toString().replaceAll("-",""));
+//                device.setDeviceType();
+//                device.setDeviceModel();
 
+                //日志添加
+                log.info("添加用户日志信息");
+                UserLog userLog = new UserLog();
+                userLog.setUserId(u.getId());
+                userLog.setUserName(u.getUsername());
+                userLog.setLoginZhu(localHost.getHostName());
+                userLog.setZhuIp(localHost.getHostAddress());
+                userLog.setLoginTime(new Date());
+                userLog.setDescribes("手机号为"+dto.getPhone()+"注册了新用户");
+                userLogMapper.insert(userLog);
+
+                //线程
+                UserThreadLocalhostUtil.setUser(u.getId());
                 String token = AppJwtUtil.getToken(Long.valueOf(u.getId()));
                 return ResultVo.success(ApiServiceExceptionEnum.LOGIN_OK,token);
             }else{
                 log.info("用户存在,登录");
+                if(user.getStatus()==2){
+                    log.info("用户不存在");
+                    return ResultVo.error(ApiServiceExceptionEnum.YONGHU_NOT_NULL);
+                }
+                if(user.getStatus()==0){
+                    log.info("此用户已被封禁");
+                    return ResultVo.error(ApiServiceExceptionEnum.BAN_USER);
+                }
+                //日志添加
+                log.info("添加用户日志信息");
+                UserLog userLog = new UserLog();
+                userLog.setUserId(user.getId());
+                userLog.setUserName(user.getUsername());
+                userLog.setLoginZhu(localHost.getHostName());
+                userLog.setZhuIp(localHost.getHostAddress());
+                userLog.setLoginTime(new Date());
+                userLog.setDescribes("验证码登录");
+                userLogMapper.insert(userLog);
 
+                //线程
+                UserThreadLocalhostUtil.setUser(user.getId());
                 String token = AppJwtUtil.getToken(Long.valueOf(user.getId()));
-
                 return ResultVo.success(ApiServiceExceptionEnum.LOGIN_OK,token);
             }
 
@@ -105,6 +174,16 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User>
                 log.info("用户不存在");
                 return ResultVo.error(ApiServiceExceptionEnum.YONGHU_NOT_NULL);
             }
+
+            if(user.getStatus()==2){
+                log.info("用户不存在");
+                return ResultVo.error(ApiServiceExceptionEnum.YONGHU_NOT_NULL);
+            }
+            if(user.getStatus()==0){
+                log.info("此用户已被封禁");
+                return ResultVo.error(ApiServiceExceptionEnum.BAN_USER);
+            }
+
             String pwd = DigestUtils.md5DigestAsHex((user.getSalt()+dto.getPassword()).getBytes(StandardCharsets.UTF_8));
             if(!user.getPassword().equals(pwd)){
                 //判断密码是否正确
@@ -112,8 +191,20 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User>
                 return ResultVo.error(ApiServiceExceptionEnum.PASSWORD_ERROR);
             }
 
-            String token = AppJwtUtil.getToken(Long.valueOf(user.getId()));
+            //日志添加
+            log.info("添加用户日志信息");
+            UserLog userLog = new UserLog();
+            userLog.setUserId(user.getId());
+            userLog.setUserName(user.getUsername());
+            userLog.setLoginZhu(localHost.getHostName());
+            userLog.setZhuIp(localHost.getHostAddress());
+            userLog.setLoginTime(new Date());
+            userLog.setDescribes("密码登录");
+            userLogMapper.insert(userLog);
 
+            //线程
+            UserThreadLocalhostUtil.setUser(user.getId());
+            String token = AppJwtUtil.getToken(Long.valueOf(user.getId()));
             return ResultVo.success(ApiServiceExceptionEnum.LOGIN_OK,token);
         }
     }
@@ -137,7 +228,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User>
         String sixDigitNumber = sb.toString();
 
         //将验证码存入redis中
-        redisTemplate.opsForValue().set("yan",sixDigitNumber);
+        redisTemplate.opsForValue().set("yan",sixDigitNumber,180, TimeUnit.SECONDS);
 
         Map<String, String> querys = new HashMap<String, String>();
         querys.put("mobile", dto.getPhone());
@@ -190,8 +281,76 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User>
             String userInfoUrl = "https://gitee.com/api/v5/user?access_token=" + accessToken;
             userInfo = HttpUtil.createGet(userInfoUrl).execute().body();
         }
+        User user = new User();
+        user.setId(String.valueOf(SnowflakeUtil.nextId()));
+
         return userInfo;
     }
+
+    @Override
+    public ResultVo logout(String token)throws Exception {
+        //解密token
+        Claims claims = AppJwtUtil.getClaimsBody(token);
+        String id = claims.get("id").toString();
+        User u = userMapper.selectById(id);
+
+        InetAddress localHost = null;
+        localHost = InetAddress.getLocalHost();
+        //日志添加
+        log.info("添加用户日志信息");
+        UserLog userLog = new UserLog();
+        userLog.setUserId(u.getId());
+        userLog.setUserName(u.getUsername());
+        userLog.setLoginZhu(localHost.getHostName());
+        userLog.setZhuIp(localHost.getHostAddress());
+        userLog.setLoginTime(new Date());
+        userLog.setDescribes("用户登出");
+        userLogMapper.insert(userLog);
+
+        //清理线程
+        UserThreadLocalhostUtil.remove();
+        return ResultVo.success(ApiServiceExceptionEnum.LOGOUT_OK);
+    }
+
+    @Override
+    public ResultVo myUserData(String token) {
+        log.info("用户个人信息");
+        Claims claims = AppJwtUtil.getClaimsBody(token);
+        String id = claims.get("id").toString();
+        User user = userMapper.selectById(id);
+        if(user==null){
+            return ResultVo.error(ApiServiceExceptionEnum.YONGHU_NOT_NULL);
+        }
+        QueryWrapper<UserProfile> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(UserProfile::getUserId,user.getId());
+        UserProfile userProfile = userProfileMapper.selectOne(queryWrapper);
+        user.setProfiles(userProfile);
+
+        return ResultVo.success(ApiServiceExceptionEnum.RESULT_SUCCES,user);
+    }
+
+    @Override
+    public ResultVo updapeUserPwd(UserPwdDto dto) {
+        Claims claims = AppJwtUtil.getClaimsBody(dto.getToken());
+        String id = claims.get("id").toString();
+        User user = userMapper.selectById(id);
+        if(user==null){
+            return ResultVo.error(ApiServiceExceptionEnum.YONGHU_NOT_NULL);
+        }
+        //从reids中获取验证码
+        String yan = (String) redisTemplate.opsForValue().get("yan");
+        if(!yan.equals(dto.getSmsCode())){
+            //判断验证码是否正确
+            log.info("验证码错误");
+            return ResultVo.error(ApiServiceExceptionEnum.YAN_ERROR);
+        }
+
+        String pwd = DigestUtils.md5DigestAsHex((user.getSalt()+dto.getPassword()).getBytes(StandardCharsets.UTF_8));
+        user.setPassword(pwd);
+        userMapper.updateById(user);
+
+        return ResultVo.success(ApiServiceExceptionEnum.RESULT_SUCCES,"修改密码成功");
+    }
 }
 
 

+ 7 - 1
src/main/java/com/neko/utils/ApiServiceExceptionEnum.java

@@ -2,7 +2,7 @@ package com.neko.utils;
 
 public enum ApiServiceExceptionEnum implements BaseExceptionEnum{
 	RESULT_SUCCES(200,"成功"),
-	RESULT_ERROR(400,"失败"),
+	RESULT_ERROR(400,"请求失败"),
 	LOGIN_OK(200,"登录成功"),
 	LOGIN_ERROR(400,"登录失败"),
 	USER_NOT_NULL(1001,"手机号不能为空"),
@@ -11,6 +11,12 @@ public enum ApiServiceExceptionEnum implements BaseExceptionEnum{
 	YAN_ERROR(1002,"验证码不正确"),
 	YONGHU_NOT_NULL(1003,"用户不存在"),
 	PASSWORD_ERROR(1003,"密码错误"),
+	LOGOUT_OK(200,"登出"),
+	SHUJU_NOT_NULL(1006,"数据不能为空"),
+	Friend_ADD_OK(200,"好友添加成功"),
+	Friend_JUJUE(1007,"拒绝好友请求"),
+	ZHUXIAO_USER(1008,"用户已被注销"),
+	BAN_USER(1009,"用户已被封禁"),
     ;
 
 

+ 34 - 0
src/main/java/com/neko/utils/OrderNumber.java

@@ -0,0 +1,34 @@
+package com.neko.utils;
+
+import lombok.Data;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Random;
+
+/**
+ * @Date 2025/5/15 17:19
+ * @Author neko
+ **/
+@Data
+public class OrderNumber {
+    private static final Random RANDOM = new Random();
+
+    /**
+     * 生成格式化订单号:日期+随机数
+     * 例如:2025051500001
+     */
+    public static String generateOrderNumber() {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
+        String datePart = sdf.format(new Date());
+
+        // 生成5位随机数
+        int randomNum = RANDOM.nextInt(90000) + 10000;
+
+        return datePart + randomNum;
+    }
+
+    public static void main(String[] args) {
+        System.out.println(generateOrderNumber());
+    }
+}

+ 32 - 0
src/main/java/com/neko/utils/UserThreadLocalhostUtil.java

@@ -0,0 +1,32 @@
+package com.neko.utils;
+
+import com.neko.domain.pojo.User;
+
+/**
+ * @Date 2025/5/20 14:27
+ * @Author neko
+ **/
+public class UserThreadLocalhostUtil {
+    private final static ThreadLocal<String> WM_USER_THREAD_LOCAL = new ThreadLocal<>();
+
+    /**
+     * 设置值
+     */
+    public static void setUser(String id){
+        //map.set 当前线程,value
+        WM_USER_THREAD_LOCAL.set(id);
+    }
+
+    /**
+     * 获取值
+     */
+    public static String getUser(){
+        //map.set 当前线程,value
+        return WM_USER_THREAD_LOCAL.get();
+    }
+
+    //清理 remove
+    public static void remove(){
+        WM_USER_THREAD_LOCAL.remove();
+    }
+}

+ 2 - 0
src/main/resources/application.yml

@@ -1,6 +1,8 @@
 server:
   port: 8888
 spring:
+  websocket:
+    enabled=true
   servlet:
     multipart:
       enabled: true

+ 5 - 0
src/main/resources/mapper/FriendRelationMapper.xml

@@ -12,6 +12,7 @@
             <result property="groupName" column="group_name" jdbcType="VARCHAR"/>
             <result property="isTop" column="is_top" jdbcType="TINYINT"/>
             <result property="isMute" column="is_mute" jdbcType="TINYINT"/>
+            <result property="status" column="status" jdbcType="TINYINT"/>
             <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
             <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
     </resultMap>
@@ -21,4 +22,8 @@
         remark,group_name,is_top,
         is_mute,create_time,update_time
     </sql>
+    <select id="findFriendList" resultType="com.neko.domain.pojo.FriendRelation">
+        select * from friend_relation where user_id=#{id} and status =  '1';
+    </select>
+
 </mapper>

+ 12 - 3
src/test/java/com/neko/NekomimiApplicationTests.java

@@ -1,13 +1,22 @@
 package com.neko;
 
-import org.junit.jupiter.api.Test;
 import org.springframework.boot.test.context.SpringBootTest;
 
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Random;
+
 @SpringBootTest
 class NekomimiApplicationTests {
 
-    @Test
-    void contextLoads() {
+    public static void main(String[] args) {
+        String s = "1234,";
+        List<String> l = Arrays.asList(s.split(","));
+        for(String ss:l){
+            System.out.println(ss);
+        }
+        System.out.println(l.size());
     }
 
 }