Procházet zdrojové kódy

neko社交聊天项目初始化

jc před 3 dny
revize
1a40985ba9
91 změnil soubory, kde provedl 3241 přidání a 0 odebrání
  1. 33 0
      .gitignore
  2. 126 0
      pom.xml
  3. 15 0
      src/main/java/com/neko/NekomimiApplication.java
  4. 37 0
      src/main/java/com/neko/config/RedisConfig.java
  5. 42 0
      src/main/java/com/neko/controller/UserController.java
  6. 14 0
      src/main/java/com/neko/domain/dto/userDto/PhoneLoginDto.java
  7. 12 0
      src/main/java/com/neko/domain/dto/userDto/YanDto.java
  8. 66 0
      src/main/java/com/neko/domain/pojo/FriendRelation.java
  9. 56 0
      src/main/java/com/neko/domain/pojo/FriendRequest.java
  10. 86 0
      src/main/java/com/neko/domain/pojo/GroupInfo.java
  11. 81 0
      src/main/java/com/neko/domain/pojo/GroupMember.java
  12. 51 0
      src/main/java/com/neko/domain/pojo/GroupRole.java
  13. 76 0
      src/main/java/com/neko/domain/pojo/Message.java
  14. 71 0
      src/main/java/com/neko/domain/pojo/MessageContentMedia.java
  15. 41 0
      src/main/java/com/neko/domain/pojo/MessageContentText.java
  16. 46 0
      src/main/java/com/neko/domain/pojo/MessageStatus.java
  17. 41 0
      src/main/java/com/neko/domain/pojo/OfflineMessage.java
  18. 78 0
      src/main/java/com/neko/domain/pojo/User.java
  19. 76 0
      src/main/java/com/neko/domain/pojo/UserDevice.java
  20. 61 0
      src/main/java/com/neko/domain/pojo/UserLog.java
  21. 71 0
      src/main/java/com/neko/domain/pojo/UserProfile.java
  22. 61 0
      src/main/java/com/neko/domain/pojo/UserRealnameAuth.java
  23. 18 0
      src/main/java/com/neko/mapper/FriendRelationMapper.java
  24. 18 0
      src/main/java/com/neko/mapper/FriendRequestMapper.java
  25. 18 0
      src/main/java/com/neko/mapper/GroupInfoMapper.java
  26. 18 0
      src/main/java/com/neko/mapper/GroupMemberMapper.java
  27. 18 0
      src/main/java/com/neko/mapper/GroupRoleMapper.java
  28. 18 0
      src/main/java/com/neko/mapper/MessageContentMediaMapper.java
  29. 18 0
      src/main/java/com/neko/mapper/MessageContentTextMapper.java
  30. 18 0
      src/main/java/com/neko/mapper/MessageMapper.java
  31. 18 0
      src/main/java/com/neko/mapper/MessageStatusMapper.java
  32. 18 0
      src/main/java/com/neko/mapper/OfflineMessageMapper.java
  33. 18 0
      src/main/java/com/neko/mapper/UserDeviceMapper.java
  34. 18 0
      src/main/java/com/neko/mapper/UserLogMapper.java
  35. 18 0
      src/main/java/com/neko/mapper/UserMapper.java
  36. 18 0
      src/main/java/com/neko/mapper/UserProfileMapper.java
  37. 18 0
      src/main/java/com/neko/mapper/UserRealnameAuthMapper.java
  38. 13 0
      src/main/java/com/neko/service/FriendRelationService.java
  39. 13 0
      src/main/java/com/neko/service/FriendRequestService.java
  40. 13 0
      src/main/java/com/neko/service/GroupInfoService.java
  41. 13 0
      src/main/java/com/neko/service/GroupMemberService.java
  42. 13 0
      src/main/java/com/neko/service/GroupRoleService.java
  43. 13 0
      src/main/java/com/neko/service/MessageContentMediaService.java
  44. 13 0
      src/main/java/com/neko/service/MessageContentTextService.java
  45. 13 0
      src/main/java/com/neko/service/MessageService.java
  46. 13 0
      src/main/java/com/neko/service/MessageStatusService.java
  47. 13 0
      src/main/java/com/neko/service/OfflineMessageService.java
  48. 13 0
      src/main/java/com/neko/service/UserDeviceService.java
  49. 13 0
      src/main/java/com/neko/service/UserLogService.java
  50. 13 0
      src/main/java/com/neko/service/UserProfileService.java
  51. 13 0
      src/main/java/com/neko/service/UserRealnameAuthService.java
  52. 19 0
      src/main/java/com/neko/service/UserService.java
  53. 22 0
      src/main/java/com/neko/service/impl/FriendRelationServiceImpl.java
  54. 22 0
      src/main/java/com/neko/service/impl/FriendRequestServiceImpl.java
  55. 22 0
      src/main/java/com/neko/service/impl/GroupInfoServiceImpl.java
  56. 22 0
      src/main/java/com/neko/service/impl/GroupMemberServiceImpl.java
  57. 22 0
      src/main/java/com/neko/service/impl/GroupRoleServiceImpl.java
  58. 22 0
      src/main/java/com/neko/service/impl/MessageContentMediaServiceImpl.java
  59. 22 0
      src/main/java/com/neko/service/impl/MessageContentTextServiceImpl.java
  60. 22 0
      src/main/java/com/neko/service/impl/MessageServiceImpl.java
  61. 22 0
      src/main/java/com/neko/service/impl/MessageStatusServiceImpl.java
  62. 22 0
      src/main/java/com/neko/service/impl/OfflineMessageServiceImpl.java
  63. 22 0
      src/main/java/com/neko/service/impl/UserDeviceServiceImpl.java
  64. 22 0
      src/main/java/com/neko/service/impl/UserLogServiceImpl.java
  65. 22 0
      src/main/java/com/neko/service/impl/UserProfileServiceImpl.java
  66. 22 0
      src/main/java/com/neko/service/impl/UserRealnameAuthServiceImpl.java
  67. 155 0
      src/main/java/com/neko/service/impl/UserServiceImpl.java
  68. 22 0
      src/main/java/com/neko/utils/ApiException.java
  69. 39 0
      src/main/java/com/neko/utils/ApiServiceExceptionEnum.java
  70. 119 0
      src/main/java/com/neko/utils/AppJwtUtil.java
  71. 18 0
      src/main/java/com/neko/utils/BaseExceptionEnum.java
  72. 311 0
      src/main/java/com/neko/utils/HttpUtils.java
  73. 89 0
      src/main/java/com/neko/utils/ResultVo.java
  74. 78 0
      src/main/java/com/neko/utils/SnowflakeUtil.java
  75. 19 0
      src/main/resources/application.yml
  76. 24 0
      src/main/resources/mapper/FriendRelationMapper.xml
  77. 22 0
      src/main/resources/mapper/FriendRequestMapper.xml
  78. 30 0
      src/main/resources/mapper/GroupInfoMapper.xml
  79. 28 0
      src/main/resources/mapper/GroupMemberMapper.xml
  80. 20 0
      src/main/resources/mapper/GroupRoleMapper.xml
  81. 26 0
      src/main/resources/mapper/MessageContentMediaMapper.xml
  82. 18 0
      src/main/resources/mapper/MessageContentTextMapper.xml
  83. 27 0
      src/main/resources/mapper/MessageMapper.xml
  84. 19 0
      src/main/resources/mapper/MessageStatusMapper.xml
  85. 18 0
      src/main/resources/mapper/OfflineMessageMapper.xml
  86. 27 0
      src/main/resources/mapper/UserDeviceMapper.xml
  87. 23 0
      src/main/resources/mapper/UserLogMapper.xml
  88. 27 0
      src/main/resources/mapper/UserMapper.xml
  89. 26 0
      src/main/resources/mapper/UserProfileMapper.xml
  90. 23 0
      src/main/resources/mapper/UserRealnameAuthMapper.xml
  91. 13 0
      src/test/java/com/neko/NekomimiApplicationTests.java

+ 33 - 0
.gitignore

@@ -0,0 +1,33 @@
+HELP.md
+target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**/target/
+!**/src/test/**/target/
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+!**/src/main/**/build/
+!**/src/test/**/build/
+
+### VS Code ###
+.vscode/

+ 126 - 0
pom.xml

@@ -0,0 +1,126 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <groupId>com.neko</groupId>
+    <artifactId>nekomimi</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+    <name>nekomimi</name>
+    <description>nekomimi</description>
+    <properties>
+        <java.version>1.8</java.version>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+        <spring-boot.version>2.6.13</spring-boot.version>
+    </properties>
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.mysql</groupId>
+            <artifactId>mysql-connector-j</artifactId>
+            <scope>runtime</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-boot-starter</artifactId>
+            <version>3.5.4</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpclient</artifactId>
+            <version>4.5.13</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpcore</artifactId>
+            <version>4.4.14</version>
+        </dependency>
+        <dependency>
+            <groupId>commons-lang</groupId>
+            <artifactId>commons-lang</artifactId>
+            <version>2.6</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba.fastjson2</groupId>
+            <artifactId>fastjson2</artifactId>
+            <version>2.0.35</version>
+        </dependency>
+
+        <dependency>
+            <groupId>io.jsonwebtoken</groupId>
+            <artifactId>jjwt</artifactId>
+            <version>0.9.1</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+            <version>3.13.0</version> <!-- 请使用最新稳定版本 -->
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-redis</artifactId>
+        </dependency>
+
+    </dependencies>
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-dependencies</artifactId>
+                <version>${spring-boot.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.8.1</version>
+                <configuration>
+                    <source>1.8</source>
+                    <target>1.8</target>
+                    <encoding>UTF-8</encoding>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <version>${spring-boot.version}</version>
+                <configuration>
+                    <mainClass>com.neko.NekomimiApplication</mainClass>
+                    <skip>true</skip>
+                </configuration>
+                <executions>
+                    <execution>
+                        <id>repackage</id>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 15 - 0
src/main/java/com/neko/NekomimiApplication.java

@@ -0,0 +1,15 @@
+package com.neko;
+
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+@MapperScan("com.neko.mapper")
+public class NekomimiApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(NekomimiApplication.class, args);
+    }
+
+}

+ 37 - 0
src/main/java/com/neko/config/RedisConfig.java

@@ -0,0 +1,37 @@
+package com.neko.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
+import org.springframework.data.redis.serializer.StringRedisSerializer;
+
+@Configuration
+public class RedisConfig {
+
+
+    @Bean
+    public RedisTemplate<String,Object> redisTemplate(LettuceConnectionFactory lettuceConnectionFactory){
+
+
+        RedisTemplate<String,Object> redisTemplate = new RedisTemplate<>();
+
+        // 设置key的序列化方式
+        redisTemplate.setKeySerializer(new StringRedisSerializer());
+        // 设置value的序列化方式
+        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
+        // 设置hash key的序列化方式
+        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
+        // 设置hash value的序列化方式
+        redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
+
+        redisTemplate.setConnectionFactory(lettuceConnectionFactory);
+
+        // 初始化RedisTemplate
+        redisTemplate.afterPropertiesSet();
+
+        return redisTemplate;
+
+    }
+}

+ 42 - 0
src/main/java/com/neko/controller/UserController.java

@@ -0,0 +1,42 @@
+package com.neko.controller;
+
+import com.neko.domain.dto.userDto.PhoneLoginDto;
+import com.neko.domain.dto.userDto.YanDto;
+import com.neko.service.UserService;
+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;
+
+/**
+ * @Date 2025/5/18 21:11
+ * @Author neko
+ **/
+@RestController
+@RequestMapping("/user")
+public class UserController {
+    @Autowired
+    UserService userService;
+
+    /**
+     * 手机号登录
+     * @param phoneLoginDto
+     * @return
+     */
+    @RequestMapping("phoen_login")
+    public ResultVo phoenLogin(@RequestBody PhoneLoginDto phoneLoginDto){
+        return userService.phoenLogin(phoneLoginDto);
+    }
+
+    /**
+     * 获取验证码
+     * @param dto
+     * @return
+     */
+    @RequestMapping("yan")
+    public ResultVo yan(@RequestBody YanDto dto){
+        return userService.yan(dto);
+    }
+
+}

+ 14 - 0
src/main/java/com/neko/domain/dto/userDto/PhoneLoginDto.java

@@ -0,0 +1,14 @@
+package com.neko.domain.dto.userDto;
+
+import lombok.Data;
+
+/**
+ * @Date 2025/5/18 21:10
+ * @Author neko
+ **/
+@Data
+public class PhoneLoginDto {
+    private String phone;
+    private String smsCode;
+    private String password;
+}

+ 12 - 0
src/main/java/com/neko/domain/dto/userDto/YanDto.java

@@ -0,0 +1,12 @@
+package com.neko.domain.dto.userDto;
+
+import lombok.Data;
+
+/**
+ * @Date 2025/5/18 21:55
+ * @Author neko
+ **/
+@Data
+public class YanDto {
+    private String phone;
+}

+ 66 - 0
src/main/java/com/neko/domain/pojo/FriendRelation.java

@@ -0,0 +1,66 @@
+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 java.io.Serializable;
+import java.util.Date;
+import lombok.Data;
+
+/**
+ * 好友关系表
+ * @TableName friend_relation
+ */
+@TableName(value ="friend_relation")
+@Data
+public class FriendRelation implements Serializable {
+    /**
+     * 关系id
+     */
+    @TableId
+    private String id;
+
+    /**
+     * 用户ID
+     */
+    private String userId;
+
+    /**
+     * 好友ID
+     */
+    private String friendId;
+
+    /**
+     * 好友备注
+     */
+    private String remark;
+
+    /**
+     * 好友分组
+     */
+    private String groupName;
+
+    /**
+     * 是否置顶 0否 1是
+     */
+    private Integer isTop;
+
+    /**
+     * 是否静音 0否 1是
+     */
+    private Integer isMute;
+
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    private Date updateTime;
+
+    @TableField(exist = false)
+    private static final long serialVersionUID = 1L;
+}

+ 56 - 0
src/main/java/com/neko/domain/pojo/FriendRequest.java

@@ -0,0 +1,56 @@
+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 java.io.Serializable;
+import java.util.Date;
+import lombok.Data;
+
+/**
+ * 好友请求表
+ * @TableName friend_request
+ */
+@TableName(value ="friend_request")
+@Data
+public class FriendRequest implements Serializable {
+    /**
+     * 请求id
+     */
+    @TableId
+    private String id;
+
+    /**
+     * 发送者id
+     */
+    private String senderId;
+
+    /**
+     * 接收者id
+     */
+    private String receiverId;
+
+    /**
+     * 请求消息
+     */
+    private String message;
+
+    /**
+     * 状态(0待处理 1已同意 2已拒绝 3一户罗)
+     */
+    private Integer status;
+
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+
+    /**
+     * 处理时间
+     */
+    private Date handledTime;
+
+    @TableField(exist = false)
+    private static final long serialVersionUID = 1L;
+}

+ 86 - 0
src/main/java/com/neko/domain/pojo/GroupInfo.java

@@ -0,0 +1,86 @@
+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 java.io.Serializable;
+import java.util.Date;
+import lombok.Data;
+
+/**
+ * 群组消息表
+ * @TableName group_info
+ */
+@TableName(value ="group_info")
+@Data
+public class GroupInfo implements Serializable {
+    /**
+     * 群组id
+     */
+    @TableId
+    private String id;
+
+    /**
+     * 群唯一标识
+     */
+    private String groupId;
+
+    /**
+     * 群名称
+     */
+    private String groupName;
+
+    /**
+     * 创建者id
+     */
+    private String cretorId;
+
+    /**
+     * 群头像
+     */
+    private String avatar;
+
+    /**
+     * 群描述
+     */
+    private String description;
+
+    /**
+     * 成员数量
+     */
+    private Integer memberCount;
+
+    /**
+     * 最大成员数量
+     */
+    private Integer maxMemberCount;
+
+    /**
+     * 状态(1正常 0已解散)
+     */
+    private Integer status;
+
+    /**
+     * 是否公开(0私有 1公开)
+     */
+    private Integer isPublic;
+
+    /**
+     * 加入是否需要审批(0不需要 1需要)
+     */
+    private Integer needApproval;
+
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    private Date updateTime;
+
+    @TableField(exist = false)
+    private static final long serialVersionUID = 1L;
+}

+ 81 - 0
src/main/java/com/neko/domain/pojo/GroupMember.java

@@ -0,0 +1,81 @@
+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 java.io.Serializable;
+import java.util.Date;
+import lombok.Data;
+
+/**
+ * 群组成员表
+ * @TableName group_member
+ */
+@TableName(value ="group_member")
+@Data
+public class GroupMember implements Serializable {
+    /**
+     * id
+     */
+    @TableId
+    private String id;
+
+    /**
+     * 群id
+     */
+    private String groupId;
+
+    /**
+     * 用户id
+     */
+    private String userId;
+
+    /**
+     * 角色id(1群主 2管理员 3普通成员)
+     */
+    private Integer roleId;
+
+    /**
+     * 用户在群里的昵称
+     */
+    private String nickname;
+
+    /**
+     * 加入时间
+     */
+    private Date joinTime;
+
+    /**
+     * 最后活跃时间
+     */
+    private Date lastActiveTime;
+
+    /**
+     * 是否禁言(0否 1是)
+     */
+    private Integer isMute;
+
+    /**
+     * 是否置顶(0否 1是)
+     */
+    private Integer isTop;
+
+    /**
+     * 未读消息数
+     */
+    private Integer unreadCount;
+
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    private Date updateTime;
+
+    @TableField(exist = false)
+    private static final long serialVersionUID = 1L;
+}

+ 51 - 0
src/main/java/com/neko/domain/pojo/GroupRole.java

@@ -0,0 +1,51 @@
+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 java.io.Serializable;
+import java.util.Date;
+import lombok.Data;
+
+/**
+ * 群组角色表
+ * @TableName group_role
+ */
+@TableName(value ="group_role")
+@Data
+public class GroupRole implements Serializable {
+    /**
+     * 角色id
+     */
+    @TableId
+    private String id;
+
+    /**
+     * 角色名称
+     */
+    private String roleName;
+
+    /**
+     * 权限列表
+     */
+    private String permissions;
+
+    /**
+     * 是否系统预设(0否 1是)
+     */
+    private Integer isSystem;
+
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    private Date updateTime;
+
+    @TableField(exist = false)
+    private static final long serialVersionUID = 1L;
+}

+ 76 - 0
src/main/java/com/neko/domain/pojo/Message.java

@@ -0,0 +1,76 @@
+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 java.io.Serializable;
+import java.util.Date;
+import lombok.Data;
+
+/**
+ * 消息主表
+ * @TableName message
+ */
+@TableName(value ="message")
+@Data
+public class Message implements Serializable {
+    /**
+     * 消息id
+     */
+    @TableId
+    private String id;
+
+    /**
+     * 消息唯一标识
+     */
+    private String messageId;
+
+    /**
+     * 发送者id
+     */
+    private String senderId;
+
+    /**
+     * 接收者id
+     */
+    private String receiverId;
+
+    /**
+     * 接收者类型 1用户 2组群
+     */
+    private Integer receiverType;
+
+    /**
+     * 消息类型 1文本 2图片 3语音 4视频 5文件 6位置 7系统
+     */
+    private Integer messageType;
+
+    /**
+     * 内容ID
+     */
+    private String contentId;
+
+    /**
+     * 是否加密
+     */
+    private Integer isEncrypted;
+
+    /**
+     * 消息状态
+     */
+    private Integer status;
+
+    /**
+     * 发送时间
+     */
+    private Date sendTime;
+
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+
+    @TableField(exist = false)
+    private static final long serialVersionUID = 1L;
+}

+ 71 - 0
src/main/java/com/neko/domain/pojo/MessageContentMedia.java

@@ -0,0 +1,71 @@
+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 java.io.Serializable;
+import java.util.Date;
+import lombok.Data;
+
+/**
+ * 媒体消息内容表
+ * @TableName message_content_media
+ */
+@TableName(value ="message_content_media")
+@Data
+public class MessageContentMedia implements Serializable {
+    /**
+     * 内容ID
+     */
+    @TableId
+    private String id;
+
+    /**
+     * 文件URL
+     */
+    private String fileUrl;
+
+    /**
+     * 文件名
+     */
+    private String fileName;
+
+    /**
+     * 文件大小
+     */
+    private String fileSize;
+
+    /**
+     * 文件类型
+     */
+    private String fileType;
+
+    /**
+     * 时长 秒
+     */
+    private Integer duration;
+
+    /**
+     * 宽度(针对图片/视频)
+     */
+    private Integer width;
+
+    /**
+     * 高度(针对图片/视频)
+     */
+    private Integer height;
+
+    /**
+     * 缩略图URL
+     */
+    private String thumbUrl;
+
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+
+    @TableField(exist = false)
+    private static final long serialVersionUID = 1L;
+}

+ 41 - 0
src/main/java/com/neko/domain/pojo/MessageContentText.java

@@ -0,0 +1,41 @@
+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 java.io.Serializable;
+import java.util.Date;
+import lombok.Data;
+
+/**
+ * 文本消息内容表
+ * @TableName message_content_text
+ */
+@TableName(value ="message_content_text")
+@Data
+public class MessageContentText implements Serializable {
+    /**
+     * 内容ID
+     */
+    @TableId
+    private String id;
+
+    /**
+     * 文本内容
+     */
+    private String content;
+
+    /**
+     * @列表(JSON数组)
+     */
+    private String mentionedList;
+
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+
+    @TableField(exist = false)
+    private static final long serialVersionUID = 1L;
+}

+ 46 - 0
src/main/java/com/neko/domain/pojo/MessageStatus.java

@@ -0,0 +1,46 @@
+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 java.io.Serializable;
+import java.util.Date;
+import lombok.Data;
+
+/**
+ * 消息状态表
+ * @TableName message_status
+ */
+@TableName(value ="message_status")
+@Data
+public class MessageStatus implements Serializable {
+    /**
+     * 状态ID
+     */
+    @TableId
+    private String id;
+
+    /**
+     * 消息唯一标识
+     */
+    private String messageId;
+
+    /**
+     * 接收这ID
+     */
+    private String receiverId;
+
+    /**
+     * 状态(0未发送 1已发送 2已接收 3已阅读)
+     */
+    private Integer status;
+
+    /**
+     * 更新时间
+     */
+    private Date updateTime;
+
+    @TableField(exist = false)
+    private static final long serialVersionUID = 1L;
+}

+ 41 - 0
src/main/java/com/neko/domain/pojo/OfflineMessage.java

@@ -0,0 +1,41 @@
+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 java.io.Serializable;
+import java.util.Date;
+import lombok.Data;
+
+/**
+ * 离线消息表
+ * @TableName offline_message
+ */
+@TableName(value ="offline_message")
+@Data
+public class OfflineMessage implements Serializable {
+    /**
+     * ID
+     */
+    @TableId
+    private String id;
+
+    /**
+     * 用户ID
+     */
+    private String userId;
+
+    /**
+     * 消息ID
+     */
+    private String messageId;
+
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+
+    @TableField(exist = false)
+    private static final long serialVersionUID = 1L;
+}

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

@@ -0,0 +1,78 @@
+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 java.io.Serializable;
+import java.util.Date;
+import lombok.Data;
+
+/**
+ * 用户表
+ * @TableName user
+ */
+@TableName(value ="user")
+@Data
+public class User implements Serializable {
+    /**
+     *
+     */
+    @TableId
+    private String id;
+
+    /**
+     * 盐
+     */
+    private String salt;
+
+    /**
+     * 用户名(neko号)
+     */
+    private String username;
+
+    /**
+     * 密码
+     */
+    private String password;
+
+    /**
+     * 手机号
+     */
+    private String phone;
+
+    /**
+     * 邮箱
+     */
+    private String email;
+
+    /**
+     * 状态 1正常 0封禁 2注销
+     */
+    private Integer status;
+
+    /**
+     * 注册时间
+     */
+    private Date registertime;
+
+    /**
+     * 注册IP
+     */
+    private String registerip;
+
+    /**
+     * 是否实名
+     */
+    private Integer isAuthSf;
+
+    /**
+     * 最后登录时间
+     */
+    private Date lastLoginTime;
+
+    private Date createTime;
+
+    @TableField(exist = false)
+    private static final long serialVersionUID = 1L;
+}

+ 76 - 0
src/main/java/com/neko/domain/pojo/UserDevice.java

@@ -0,0 +1,76 @@
+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 java.io.Serializable;
+import java.util.Date;
+import lombok.Data;
+
+/**
+ * 用户设备表
+ * @TableName user_device
+ */
+@TableName(value ="user_device")
+@Data
+public class UserDevice implements Serializable {
+    /**
+     *
+     */
+    @TableId
+    private String id;
+
+    /**
+     * 用户ID
+     */
+    private String userId;
+
+    /**
+     * 设备唯一标识
+     */
+    private String deviceId;
+
+    /**
+     * 设备类型
+     */
+    private String deviceType;
+
+    /**
+     * 设备型号
+     */
+    private String deviceModel;
+
+    /**
+     * 操作系统版本
+     */
+    private String osVersion;
+
+    /**
+     * 应用版本
+     */
+    private String appVersuib;
+
+    /**
+     * 推送令牌
+     */
+    private String pushToken;
+
+    /**
+     * 在线状态 0离线 1在线
+     */
+    private String isNoline;
+
+    /**
+     * 最后活跃时间
+     */
+    private Date listActiveTime;
+
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+
+    @TableField(exist = false)
+    private static final long serialVersionUID = 1L;
+}

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

@@ -0,0 +1,61 @@
+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 java.io.Serializable;
+import java.util.Date;
+import lombok.Data;
+
+/**
+ *
+ * @TableName user_log
+ */
+@TableName(value ="user_log")
+@Data
+public class UserLog implements Serializable {
+    /**
+     *
+     */
+    @TableId
+    private Integer id;
+
+    /**
+     * 登录用户ID
+     */
+    private String userId;
+
+    /**
+     * 登录用户
+     */
+    private String userName;
+
+    /**
+     * 登录设备名称
+     */
+    private String loginZhu;
+
+    /**
+     * 主机ip
+     */
+    private String zhuIp;
+
+    /**
+     * 登录时间
+     */
+    private Date loginTime;
+
+    /**
+     * 操作描述
+     */
+    private String describe;
+
+    /**
+     * 登出时间
+     */
+    private Date logoutTime;
+
+    @TableField(exist = false)
+    private static final long serialVersionUID = 1L;
+}

+ 71 - 0
src/main/java/com/neko/domain/pojo/UserProfile.java

@@ -0,0 +1,71 @@
+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 java.io.Serializable;
+import java.util.Date;
+import lombok.Data;
+
+/**
+ * 用户资料表
+ * @TableName user_profile
+ */
+@TableName(value ="user_profile")
+@Data
+public class UserProfile implements Serializable {
+    /**
+     *
+     */
+    @TableId
+    private String id;
+
+    /**
+     * 用户ID
+     */
+    private String userId;
+
+    /**
+     * 昵称
+     */
+    private String nickname;
+
+    /**
+     * 头像URL
+     */
+    private String avatar;
+
+    /**
+     * 性别 0未知 1男 2女
+     */
+    private String gender;
+
+    /**
+     * 生日
+     */
+    private Date birthday;
+
+    /**
+     * 个性签名
+     */
+    private String signatture;
+
+    /**
+     * 地区
+     */
+    private String region;
+
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+
+    /**
+     * 创建时间
+     */
+    private Date updateTime;
+
+    @TableField(exist = false)
+    private static final long serialVersionUID = 1L;
+}

+ 61 - 0
src/main/java/com/neko/domain/pojo/UserRealnameAuth.java

@@ -0,0 +1,61 @@
+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 java.io.Serializable;
+import java.util.Date;
+import lombok.Data;
+
+/**
+ * 实名认证表
+ * @TableName user_realname_auth
+ */
+@TableName(value ="user_realname_auth")
+@Data
+public class UserRealnameAuth implements Serializable {
+    /**
+     *
+     */
+    @TableId
+    private String id;
+
+    /**
+     * 所属用户
+     */
+    private String userId;
+
+    /**
+     * 真实姓名
+     */
+    private String zhenName;
+
+    /**
+     * 身份证号
+     */
+    private String sfId;
+
+    /**
+     * 性别
+     */
+    private String sex;
+
+    /**
+     * 生日
+     */
+    private Date birthday;
+
+    /**
+     * 住址
+     */
+    private String address;
+
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+
+    @TableField(exist = false)
+    private static final long serialVersionUID = 1L;
+}

+ 18 - 0
src/main/java/com/neko/mapper/FriendRelationMapper.java

@@ -0,0 +1,18 @@
+package com.neko.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.neko.domain.pojo.FriendRelation;
+
+/**
+* @author 金聪
+* @description 针对表【friend_relation(好友关系表)】的数据库操作Mapper
+* @createDate 2025-05-18 20:59:28
+* @Entity com.neko.domain.FriendRelation
+*/
+public interface FriendRelationMapper extends BaseMapper<FriendRelation> {
+
+}
+
+
+
+

+ 18 - 0
src/main/java/com/neko/mapper/FriendRequestMapper.java

@@ -0,0 +1,18 @@
+package com.neko.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.neko.domain.pojo.FriendRequest;
+
+/**
+* @author 金聪
+* @description 针对表【friend_request(好友请求表)】的数据库操作Mapper
+* @createDate 2025-05-18 20:59:28
+* @Entity com.neko.domain.FriendRequest
+*/
+public interface FriendRequestMapper extends BaseMapper<FriendRequest> {
+
+}
+
+
+
+

+ 18 - 0
src/main/java/com/neko/mapper/GroupInfoMapper.java

@@ -0,0 +1,18 @@
+package com.neko.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.neko.domain.pojo.GroupInfo;
+
+/**
+* @author 金聪
+* @description 针对表【group_info(群组消息表)】的数据库操作Mapper
+* @createDate 2025-05-18 20:59:28
+* @Entity com.neko.domain.GroupInfo
+*/
+public interface GroupInfoMapper extends BaseMapper<GroupInfo> {
+
+}
+
+
+
+

+ 18 - 0
src/main/java/com/neko/mapper/GroupMemberMapper.java

@@ -0,0 +1,18 @@
+package com.neko.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.neko.domain.pojo.GroupMember;
+
+/**
+* @author 金聪
+* @description 针对表【group_member(群组成员表)】的数据库操作Mapper
+* @createDate 2025-05-18 20:59:28
+* @Entity com.neko.domain.GroupMember
+*/
+public interface GroupMemberMapper extends BaseMapper<GroupMember> {
+
+}
+
+
+
+

+ 18 - 0
src/main/java/com/neko/mapper/GroupRoleMapper.java

@@ -0,0 +1,18 @@
+package com.neko.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.neko.domain.pojo.GroupRole;
+
+/**
+* @author 金聪
+* @description 针对表【group_role(群组角色表)】的数据库操作Mapper
+* @createDate 2025-05-18 20:59:28
+* @Entity com.neko.domain.GroupRole
+*/
+public interface GroupRoleMapper extends BaseMapper<GroupRole> {
+
+}
+
+
+
+

+ 18 - 0
src/main/java/com/neko/mapper/MessageContentMediaMapper.java

@@ -0,0 +1,18 @@
+package com.neko.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.neko.domain.pojo.MessageContentMedia;
+
+/**
+* @author 金聪
+* @description 针对表【message_content_media(媒体消息内容表)】的数据库操作Mapper
+* @createDate 2025-05-18 20:59:28
+* @Entity com.neko.domain.MessageContentMedia
+*/
+public interface MessageContentMediaMapper extends BaseMapper<MessageContentMedia> {
+
+}
+
+
+
+

+ 18 - 0
src/main/java/com/neko/mapper/MessageContentTextMapper.java

@@ -0,0 +1,18 @@
+package com.neko.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.neko.domain.pojo.MessageContentText;
+
+/**
+* @author 金聪
+* @description 针对表【message_content_text(文本消息内容表)】的数据库操作Mapper
+* @createDate 2025-05-18 20:59:28
+* @Entity com.neko.domain.MessageContentText
+*/
+public interface MessageContentTextMapper extends BaseMapper<MessageContentText> {
+
+}
+
+
+
+

+ 18 - 0
src/main/java/com/neko/mapper/MessageMapper.java

@@ -0,0 +1,18 @@
+package com.neko.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.neko.domain.pojo.Message;
+
+/**
+* @author 金聪
+* @description 针对表【message(消息主表)】的数据库操作Mapper
+* @createDate 2025-05-18 20:59:28
+* @Entity com.neko.domain.Message
+*/
+public interface MessageMapper extends BaseMapper<Message> {
+
+}
+
+
+
+

+ 18 - 0
src/main/java/com/neko/mapper/MessageStatusMapper.java

@@ -0,0 +1,18 @@
+package com.neko.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.neko.domain.pojo.MessageStatus;
+
+/**
+* @author 金聪
+* @description 针对表【message_status(消息状态表)】的数据库操作Mapper
+* @createDate 2025-05-18 20:59:28
+* @Entity com.neko.domain.MessageStatus
+*/
+public interface MessageStatusMapper extends BaseMapper<MessageStatus> {
+
+}
+
+
+
+

+ 18 - 0
src/main/java/com/neko/mapper/OfflineMessageMapper.java

@@ -0,0 +1,18 @@
+package com.neko.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.neko.domain.pojo.OfflineMessage;
+
+/**
+* @author 金聪
+* @description 针对表【offline_message(离线消息表)】的数据库操作Mapper
+* @createDate 2025-05-18 20:59:28
+* @Entity com.neko.domain.OfflineMessage
+*/
+public interface OfflineMessageMapper extends BaseMapper<OfflineMessage> {
+
+}
+
+
+
+

+ 18 - 0
src/main/java/com/neko/mapper/UserDeviceMapper.java

@@ -0,0 +1,18 @@
+package com.neko.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.neko.domain.pojo.UserDevice;
+
+/**
+* @author 金聪
+* @description 针对表【user_device(用户设备表)】的数据库操作Mapper
+* @createDate 2025-05-18 20:59:28
+* @Entity com.neko.domain.UserDevice
+*/
+public interface UserDeviceMapper extends BaseMapper<UserDevice> {
+
+}
+
+
+
+

+ 18 - 0
src/main/java/com/neko/mapper/UserLogMapper.java

@@ -0,0 +1,18 @@
+package com.neko.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.neko.domain.pojo.UserLog;
+
+/**
+* @author 金聪
+* @description 针对表【user_log】的数据库操作Mapper
+* @createDate 2025-05-18 20:59:28
+* @Entity com.neko.domain.UserLog
+*/
+public interface UserLogMapper extends BaseMapper<UserLog> {
+
+}
+
+
+
+

+ 18 - 0
src/main/java/com/neko/mapper/UserMapper.java

@@ -0,0 +1,18 @@
+package com.neko.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.neko.domain.pojo.User;
+
+/**
+* @author 金聪
+* @description 针对表【user(用户表)】的数据库操作Mapper
+* @createDate 2025-05-18 20:59:28
+* @Entity com.neko.domain.User
+*/
+public interface UserMapper extends BaseMapper<User> {
+
+}
+
+
+
+

+ 18 - 0
src/main/java/com/neko/mapper/UserProfileMapper.java

@@ -0,0 +1,18 @@
+package com.neko.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.neko.domain.pojo.UserProfile;
+
+/**
+* @author 金聪
+* @description 针对表【user_profile(用户资料表)】的数据库操作Mapper
+* @createDate 2025-05-18 20:59:28
+* @Entity com.neko.domain.UserProfile
+*/
+public interface UserProfileMapper extends BaseMapper<UserProfile> {
+
+}
+
+
+
+

+ 18 - 0
src/main/java/com/neko/mapper/UserRealnameAuthMapper.java

@@ -0,0 +1,18 @@
+package com.neko.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.neko.domain.pojo.UserRealnameAuth;
+
+/**
+* @author 金聪
+* @description 针对表【user_realname_auth(实名认证表)】的数据库操作Mapper
+* @createDate 2025-05-18 20:59:28
+* @Entity com.neko.domain.UserRealnameAuth
+*/
+public interface UserRealnameAuthMapper extends BaseMapper<UserRealnameAuth> {
+
+}
+
+
+
+

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

@@ -0,0 +1,13 @@
+package com.neko.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.neko.domain.pojo.FriendRelation;
+
+/**
+* @author 金聪
+* @description 针对表【friend_relation(好友关系表)】的数据库操作Service
+* @createDate 2025-05-18 20:59:28
+*/
+public interface FriendRelationService extends IService<FriendRelation> {
+
+}

+ 13 - 0
src/main/java/com/neko/service/FriendRequestService.java

@@ -0,0 +1,13 @@
+package com.neko.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.neko.domain.pojo.FriendRequest;
+
+/**
+* @author 金聪
+* @description 针对表【friend_request(好友请求表)】的数据库操作Service
+* @createDate 2025-05-18 20:59:28
+*/
+public interface FriendRequestService extends IService<FriendRequest> {
+
+}

+ 13 - 0
src/main/java/com/neko/service/GroupInfoService.java

@@ -0,0 +1,13 @@
+package com.neko.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.neko.domain.pojo.GroupInfo;
+
+/**
+* @author 金聪
+* @description 针对表【group_info(群组消息表)】的数据库操作Service
+* @createDate 2025-05-18 20:59:28
+*/
+public interface GroupInfoService extends IService<GroupInfo> {
+
+}

+ 13 - 0
src/main/java/com/neko/service/GroupMemberService.java

@@ -0,0 +1,13 @@
+package com.neko.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.neko.domain.pojo.GroupMember;
+
+/**
+* @author 金聪
+* @description 针对表【group_member(群组成员表)】的数据库操作Service
+* @createDate 2025-05-18 20:59:28
+*/
+public interface GroupMemberService extends IService<GroupMember> {
+
+}

+ 13 - 0
src/main/java/com/neko/service/GroupRoleService.java

@@ -0,0 +1,13 @@
+package com.neko.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.neko.domain.pojo.GroupRole;
+
+/**
+* @author 金聪
+* @description 针对表【group_role(群组角色表)】的数据库操作Service
+* @createDate 2025-05-18 20:59:28
+*/
+public interface GroupRoleService extends IService<GroupRole> {
+
+}

+ 13 - 0
src/main/java/com/neko/service/MessageContentMediaService.java

@@ -0,0 +1,13 @@
+package com.neko.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.neko.domain.pojo.MessageContentMedia;
+
+/**
+* @author 金聪
+* @description 针对表【message_content_media(媒体消息内容表)】的数据库操作Service
+* @createDate 2025-05-18 20:59:28
+*/
+public interface MessageContentMediaService extends IService<MessageContentMedia> {
+
+}

+ 13 - 0
src/main/java/com/neko/service/MessageContentTextService.java

@@ -0,0 +1,13 @@
+package com.neko.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.neko.domain.pojo.MessageContentText;
+
+/**
+* @author 金聪
+* @description 针对表【message_content_text(文本消息内容表)】的数据库操作Service
+* @createDate 2025-05-18 20:59:28
+*/
+public interface MessageContentTextService extends IService<MessageContentText> {
+
+}

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

@@ -0,0 +1,13 @@
+package com.neko.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.neko.domain.pojo.Message;
+
+/**
+* @author 金聪
+* @description 针对表【message(消息主表)】的数据库操作Service
+* @createDate 2025-05-18 20:59:28
+*/
+public interface MessageService extends IService<Message> {
+
+}

+ 13 - 0
src/main/java/com/neko/service/MessageStatusService.java

@@ -0,0 +1,13 @@
+package com.neko.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.neko.domain.pojo.MessageStatus;
+
+/**
+* @author 金聪
+* @description 针对表【message_status(消息状态表)】的数据库操作Service
+* @createDate 2025-05-18 20:59:28
+*/
+public interface MessageStatusService extends IService<MessageStatus> {
+
+}

+ 13 - 0
src/main/java/com/neko/service/OfflineMessageService.java

@@ -0,0 +1,13 @@
+package com.neko.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.neko.domain.pojo.OfflineMessage;
+
+/**
+* @author 金聪
+* @description 针对表【offline_message(离线消息表)】的数据库操作Service
+* @createDate 2025-05-18 20:59:28
+*/
+public interface OfflineMessageService extends IService<OfflineMessage> {
+
+}

+ 13 - 0
src/main/java/com/neko/service/UserDeviceService.java

@@ -0,0 +1,13 @@
+package com.neko.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.neko.domain.pojo.UserDevice;
+
+/**
+* @author 金聪
+* @description 针对表【user_device(用户设备表)】的数据库操作Service
+* @createDate 2025-05-18 20:59:28
+*/
+public interface UserDeviceService extends IService<UserDevice> {
+
+}

+ 13 - 0
src/main/java/com/neko/service/UserLogService.java

@@ -0,0 +1,13 @@
+package com.neko.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.neko.domain.pojo.UserLog;
+
+/**
+* @author 金聪
+* @description 针对表【user_log】的数据库操作Service
+* @createDate 2025-05-18 20:59:28
+*/
+public interface UserLogService extends IService<UserLog> {
+
+}

+ 13 - 0
src/main/java/com/neko/service/UserProfileService.java

@@ -0,0 +1,13 @@
+package com.neko.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.neko.domain.pojo.UserProfile;
+
+/**
+* @author 金聪
+* @description 针对表【user_profile(用户资料表)】的数据库操作Service
+* @createDate 2025-05-18 20:59:28
+*/
+public interface UserProfileService extends IService<UserProfile> {
+
+}

+ 13 - 0
src/main/java/com/neko/service/UserRealnameAuthService.java

@@ -0,0 +1,13 @@
+package com.neko.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.neko.domain.pojo.UserRealnameAuth;
+
+/**
+* @author 金聪
+* @description 针对表【user_realname_auth(实名认证表)】的数据库操作Service
+* @createDate 2025-05-18 20:59:28
+*/
+public interface UserRealnameAuthService extends IService<UserRealnameAuth> {
+
+}

+ 19 - 0
src/main/java/com/neko/service/UserService.java

@@ -0,0 +1,19 @@
+package com.neko.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+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;
+
+/**
+* @author 金聪
+* @description 针对表【user(用户表)】的数据库操作Service
+* @createDate 2025-05-18 20:59:28
+*/
+public interface UserService extends IService<User> {
+
+    ResultVo phoenLogin(PhoneLoginDto phoneLoginDto);
+
+    ResultVo yan(YanDto dto);
+}

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

@@ -0,0 +1,22 @@
+package com.neko.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.neko.domain.pojo.FriendRelation;
+import com.neko.service.FriendRelationService;
+import com.neko.mapper.FriendRelationMapper;
+import org.springframework.stereotype.Service;
+
+/**
+* @author 金聪
+* @description 针对表【friend_relation(好友关系表)】的数据库操作Service实现
+* @createDate 2025-05-18 20:59:28
+*/
+@Service
+public class FriendRelationServiceImpl extends ServiceImpl<FriendRelationMapper, FriendRelation>
+    implements FriendRelationService{
+
+}
+
+
+
+

+ 22 - 0
src/main/java/com/neko/service/impl/FriendRequestServiceImpl.java

@@ -0,0 +1,22 @@
+package com.neko.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.neko.domain.pojo.FriendRequest;
+import com.neko.service.FriendRequestService;
+import com.neko.mapper.FriendRequestMapper;
+import org.springframework.stereotype.Service;
+
+/**
+* @author 金聪
+* @description 针对表【friend_request(好友请求表)】的数据库操作Service实现
+* @createDate 2025-05-18 20:59:28
+*/
+@Service
+public class FriendRequestServiceImpl extends ServiceImpl<FriendRequestMapper, FriendRequest>
+    implements FriendRequestService{
+
+}
+
+
+
+

+ 22 - 0
src/main/java/com/neko/service/impl/GroupInfoServiceImpl.java

@@ -0,0 +1,22 @@
+package com.neko.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.neko.domain.pojo.GroupInfo;
+import com.neko.service.GroupInfoService;
+import com.neko.mapper.GroupInfoMapper;
+import org.springframework.stereotype.Service;
+
+/**
+* @author 金聪
+* @description 针对表【group_info(群组消息表)】的数据库操作Service实现
+* @createDate 2025-05-18 20:59:28
+*/
+@Service
+public class GroupInfoServiceImpl extends ServiceImpl<GroupInfoMapper, GroupInfo>
+    implements GroupInfoService{
+
+}
+
+
+
+

+ 22 - 0
src/main/java/com/neko/service/impl/GroupMemberServiceImpl.java

@@ -0,0 +1,22 @@
+package com.neko.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.neko.domain.pojo.GroupMember;
+import com.neko.service.GroupMemberService;
+import com.neko.mapper.GroupMemberMapper;
+import org.springframework.stereotype.Service;
+
+/**
+* @author 金聪
+* @description 针对表【group_member(群组成员表)】的数据库操作Service实现
+* @createDate 2025-05-18 20:59:28
+*/
+@Service
+public class GroupMemberServiceImpl extends ServiceImpl<GroupMemberMapper, GroupMember>
+    implements GroupMemberService{
+
+}
+
+
+
+

+ 22 - 0
src/main/java/com/neko/service/impl/GroupRoleServiceImpl.java

@@ -0,0 +1,22 @@
+package com.neko.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.neko.domain.pojo.GroupRole;
+import com.neko.service.GroupRoleService;
+import com.neko.mapper.GroupRoleMapper;
+import org.springframework.stereotype.Service;
+
+/**
+* @author 金聪
+* @description 针对表【group_role(群组角色表)】的数据库操作Service实现
+* @createDate 2025-05-18 20:59:28
+*/
+@Service
+public class GroupRoleServiceImpl extends ServiceImpl<GroupRoleMapper, GroupRole>
+    implements GroupRoleService{
+
+}
+
+
+
+

+ 22 - 0
src/main/java/com/neko/service/impl/MessageContentMediaServiceImpl.java

@@ -0,0 +1,22 @@
+package com.neko.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.neko.domain.pojo.MessageContentMedia;
+import com.neko.service.MessageContentMediaService;
+import com.neko.mapper.MessageContentMediaMapper;
+import org.springframework.stereotype.Service;
+
+/**
+* @author 金聪
+* @description 针对表【message_content_media(媒体消息内容表)】的数据库操作Service实现
+* @createDate 2025-05-18 20:59:28
+*/
+@Service
+public class MessageContentMediaServiceImpl extends ServiceImpl<MessageContentMediaMapper, MessageContentMedia>
+    implements MessageContentMediaService{
+
+}
+
+
+
+

+ 22 - 0
src/main/java/com/neko/service/impl/MessageContentTextServiceImpl.java

@@ -0,0 +1,22 @@
+package com.neko.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.neko.domain.pojo.MessageContentText;
+import com.neko.service.MessageContentTextService;
+import com.neko.mapper.MessageContentTextMapper;
+import org.springframework.stereotype.Service;
+
+/**
+* @author 金聪
+* @description 针对表【message_content_text(文本消息内容表)】的数据库操作Service实现
+* @createDate 2025-05-18 20:59:28
+*/
+@Service
+public class MessageContentTextServiceImpl extends ServiceImpl<MessageContentTextMapper, MessageContentText>
+    implements MessageContentTextService{
+
+}
+
+
+
+

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

@@ -0,0 +1,22 @@
+package com.neko.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.neko.domain.pojo.Message;
+import com.neko.service.MessageService;
+import com.neko.mapper.MessageMapper;
+import org.springframework.stereotype.Service;
+
+/**
+* @author 金聪
+* @description 针对表【message(消息主表)】的数据库操作Service实现
+* @createDate 2025-05-18 20:59:28
+*/
+@Service
+public class MessageServiceImpl extends ServiceImpl<MessageMapper, Message>
+    implements MessageService{
+
+}
+
+
+
+

+ 22 - 0
src/main/java/com/neko/service/impl/MessageStatusServiceImpl.java

@@ -0,0 +1,22 @@
+package com.neko.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.neko.domain.pojo.MessageStatus;
+import com.neko.service.MessageStatusService;
+import com.neko.mapper.MessageStatusMapper;
+import org.springframework.stereotype.Service;
+
+/**
+* @author 金聪
+* @description 针对表【message_status(消息状态表)】的数据库操作Service实现
+* @createDate 2025-05-18 20:59:28
+*/
+@Service
+public class MessageStatusServiceImpl extends ServiceImpl<MessageStatusMapper, MessageStatus>
+    implements MessageStatusService{
+
+}
+
+
+
+

+ 22 - 0
src/main/java/com/neko/service/impl/OfflineMessageServiceImpl.java

@@ -0,0 +1,22 @@
+package com.neko.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.neko.domain.pojo.OfflineMessage;
+import com.neko.service.OfflineMessageService;
+import com.neko.mapper.OfflineMessageMapper;
+import org.springframework.stereotype.Service;
+
+/**
+* @author 金聪
+* @description 针对表【offline_message(离线消息表)】的数据库操作Service实现
+* @createDate 2025-05-18 20:59:28
+*/
+@Service
+public class OfflineMessageServiceImpl extends ServiceImpl<OfflineMessageMapper, OfflineMessage>
+    implements OfflineMessageService{
+
+}
+
+
+
+

+ 22 - 0
src/main/java/com/neko/service/impl/UserDeviceServiceImpl.java

@@ -0,0 +1,22 @@
+package com.neko.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.neko.domain.pojo.UserDevice;
+import com.neko.service.UserDeviceService;
+import com.neko.mapper.UserDeviceMapper;
+import org.springframework.stereotype.Service;
+
+/**
+* @author 金聪
+* @description 针对表【user_device(用户设备表)】的数据库操作Service实现
+* @createDate 2025-05-18 20:59:28
+*/
+@Service
+public class UserDeviceServiceImpl extends ServiceImpl<UserDeviceMapper, UserDevice>
+    implements UserDeviceService{
+
+}
+
+
+
+

+ 22 - 0
src/main/java/com/neko/service/impl/UserLogServiceImpl.java

@@ -0,0 +1,22 @@
+package com.neko.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.neko.domain.pojo.UserLog;
+import com.neko.service.UserLogService;
+import com.neko.mapper.UserLogMapper;
+import org.springframework.stereotype.Service;
+
+/**
+* @author 金聪
+* @description 针对表【user_log】的数据库操作Service实现
+* @createDate 2025-05-18 20:59:28
+*/
+@Service
+public class UserLogServiceImpl extends ServiceImpl<UserLogMapper, UserLog>
+    implements UserLogService{
+
+}
+
+
+
+

+ 22 - 0
src/main/java/com/neko/service/impl/UserProfileServiceImpl.java

@@ -0,0 +1,22 @@
+package com.neko.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.neko.domain.pojo.UserProfile;
+import com.neko.service.UserProfileService;
+import com.neko.mapper.UserProfileMapper;
+import org.springframework.stereotype.Service;
+
+/**
+* @author 金聪
+* @description 针对表【user_profile(用户资料表)】的数据库操作Service实现
+* @createDate 2025-05-18 20:59:28
+*/
+@Service
+public class UserProfileServiceImpl extends ServiceImpl<UserProfileMapper, UserProfile>
+    implements UserProfileService{
+
+}
+
+
+
+

+ 22 - 0
src/main/java/com/neko/service/impl/UserRealnameAuthServiceImpl.java

@@ -0,0 +1,22 @@
+package com.neko.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.neko.domain.pojo.UserRealnameAuth;
+import com.neko.service.UserRealnameAuthService;
+import com.neko.mapper.UserRealnameAuthMapper;
+import org.springframework.stereotype.Service;
+
+/**
+* @author 金聪
+* @description 针对表【user_realname_auth(实名认证表)】的数据库操作Service实现
+* @createDate 2025-05-18 20:59:28
+*/
+@Service
+public class UserRealnameAuthServiceImpl extends ServiceImpl<UserRealnameAuthMapper, UserRealnameAuth>
+    implements UserRealnameAuthService{
+
+}
+
+
+
+

+ 155 - 0
src/main/java/com/neko/service/impl/UserServiceImpl.java

@@ -0,0 +1,155 @@
+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.userDto.PhoneLoginDto;
+import com.neko.domain.dto.userDto.YanDto;
+import com.neko.domain.pojo.User;
+import com.neko.service.UserService;
+import com.neko.mapper.UserMapper;
+import com.neko.utils.*;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.http.HttpResponse;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Service;
+import org.springframework.util.DigestUtils;
+import org.springframework.util.StringUtils;
+
+import java.nio.charset.StandardCharsets;
+import java.util.*;
+
+/**
+* @author 金聪
+* @description 针对表【user(用户表)】的数据库操作Service实现
+* @createDate 2025-05-18 20:59:28
+*/
+@Slf4j
+@Service
+public class UserServiceImpl extends ServiceImpl<UserMapper, User>
+    implements UserService{
+    @Autowired
+    private UserMapper userMapper;
+    @Autowired
+    private RedisTemplate redisTemplate;
+
+    @Override
+    public ResultVo phoenLogin(PhoneLoginDto dto) {
+        if(dto.getPassword()==null){
+            return ResultVo.error(ApiServiceExceptionEnum.USER_NOT_NULL);
+        }
+        if(StringUtils.isEmpty(dto.getPassword())){
+            log.info("验证码登录");
+            if(dto.getSmsCode()==null){
+                //判断验证码是否为空
+                return ResultVo.error(ApiServiceExceptionEnum.YAN_NOT_NULL);
+            }
+            //从reids中获取验证码
+            String yan = (String) redisTemplate.opsForValue().get("yan");
+            if(!yan.equals(dto.getSmsCode())){
+                //判断验证码是否正确
+                return ResultVo.error(ApiServiceExceptionEnum.YAN_ERROR);
+            }
+            QueryWrapper<User> queryWrapper = new QueryWrapper<>();
+            queryWrapper.lambda().eq(User::getPhone,dto.getPhone());
+            User user = userMapper.selectOne(queryWrapper);
+
+            if(user==null){
+                log.info("用户不存在,创建新用户");
+                User u = new User();
+                u.setId(String.valueOf(SnowflakeUtil.nextId()));
+                u.setPhone(dto.getPhone());
+                //生成一个随机的6位密码
+                Random random = new Random();
+                StringBuilder sb = new StringBuilder();
+                for (int i = 0; i < 6; i++) {
+                    int digit = random.nextInt(10);
+                    sb.append(digit);
+                }
+                String m = sb.toString();
+                String uuid = UUID.randomUUID().toString().replaceAll("-","");
+                String pwd = DigestUtils.md5DigestAsHex((uuid+m).getBytes(StandardCharsets.UTF_8));
+                u.setSalt(uuid);
+                u.setPassword(pwd);
+                u.setUsername("PTYH"+dto.getPhone());
+                u.setCreateTime(new Date());
+                userMapper.insert(u);
+
+                String token = AppJwtUtil.getToken(Long.valueOf(u.getId()));
+                return ResultVo.success(ApiServiceExceptionEnum.LOGIN_OK,token);
+            }else{
+                log.info("用户存在,登录");
+
+                String token = AppJwtUtil.getToken(Long.valueOf(user.getId()));
+
+                return ResultVo.success(ApiServiceExceptionEnum.LOGIN_OK,token);
+            }
+
+        }else{
+            log.info("密码登录");
+            if(dto.getPassword()==null){
+                //判断密码是否为空
+                return ResultVo.error(ApiServiceExceptionEnum.PASSWORD_NOT_NULL);
+            }
+            //获取用户信息
+            QueryWrapper<User> queryWrapper = new QueryWrapper<>();
+            queryWrapper.lambda().eq(User::getPhone,dto.getPhone());
+            User user = userMapper.selectOne(queryWrapper);
+            if(user==null){
+                log.info("用户不存在");
+                return ResultVo.error(ApiServiceExceptionEnum.YONGHU_NOT_NULL);
+            }
+            String pwd = DigestUtils.md5DigestAsHex((user.getSalt()+dto.getPassword()).getBytes(StandardCharsets.UTF_8));
+            if(!user.getPassword().equals(pwd)){
+                //判断密码是否正确
+                log.info("密码错误");
+                return ResultVo.error(ApiServiceExceptionEnum.PASSWORD_ERROR);
+            }
+
+            String token = AppJwtUtil.getToken(Long.valueOf(user.getId()));
+
+            return ResultVo.success(ApiServiceExceptionEnum.LOGIN_OK,token);
+        }
+    }
+
+    @Override
+    public ResultVo yan(YanDto dto) {
+        String host = "https://gyytz.market.alicloudapi.com";
+        String path = "/sms/smsSend";
+        String method = "POST";
+        String appcode = "8e678d7c72f14e9193e29747f9d73a6d";
+        Map<String, String> headers = new HashMap<String, String>();
+        headers.put("Authorization", "APPCODE " + appcode);
+
+        //生成一个随机6位的验证码
+        Random random = new Random();
+        StringBuilder sb = new StringBuilder();
+        for (int i = 0; i < 6; i++) {
+            int digit = random.nextInt(10);
+            sb.append(digit);
+        }
+        String sixDigitNumber = sb.toString();
+
+        //将验证码存入redis中
+        redisTemplate.opsForValue().set("yan",sixDigitNumber);
+
+        Map<String, String> querys = new HashMap<String, String>();
+        querys.put("mobile", dto.getPhone());
+        querys.put("param", "**code**:"+sixDigitNumber+",**minute**:6");
+
+        querys.put("smsSignId", "2e65b1bb3d054466b82f0c9d125465e2");
+        querys.put("templateId", "908e94ccf08b4476ba6c876d13f084ad");
+        Map<String, String> bodys = new HashMap<String, String>();
+        try {
+            HttpResponse response = HttpUtils.doPost(host, path, method, headers, querys, bodys);
+            System.out.println(response.toString());
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return ResultVo.success(sixDigitNumber);
+    }
+}
+
+
+
+

+ 22 - 0
src/main/java/com/neko/utils/ApiException.java

@@ -0,0 +1,22 @@
+package com.neko.utils;
+
+import lombok.Data;
+
+
+@Data
+public class ApiException extends RuntimeException{
+
+	public Integer code;
+	public String msg;
+	public ApiException(BaseExceptionEnum baseExceptionEnum) {
+		super(baseExceptionEnum.getMessage());
+		this.code = baseExceptionEnum.getCode();
+		this.msg = baseExceptionEnum.getMessage();
+	}
+	public ApiException(Integer code, String message) {
+		super(message);
+		this.code=code;
+		this.msg=message;
+	}
+
+}

+ 39 - 0
src/main/java/com/neko/utils/ApiServiceExceptionEnum.java

@@ -0,0 +1,39 @@
+package com.neko.utils;
+
+public enum ApiServiceExceptionEnum implements BaseExceptionEnum{
+	RESULT_SUCCES(200,"成功"),
+	RESULT_ERROR(400,"失败"),
+	LOGIN_OK(200,"登录成功"),
+	LOGIN_ERROR(400,"登录失败"),
+	USER_NOT_NULL(1001,"手机号不能为空"),
+	YAN_NOT_NULL(1001,"验证码不能为空"),
+	PASSWORD_NOT_NULL(1001,"密码不能为空"),
+	YAN_ERROR(1002,"验证码不正确"),
+	YONGHU_NOT_NULL(1003,"用户不存在"),
+	PASSWORD_ERROR(1003,"密码错误"),
+    ;
+
+
+
+     ApiServiceExceptionEnum(Integer code , String message) {
+
+    	 this.code=code;
+    	 this.message=message;
+    }
+     private Integer code;
+
+     private String message;
+
+    @Override
+	public Integer getCode() {
+		// TODO Auto-generated method stub
+		return code;
+	}
+
+	@Override
+	public String getMessage() {
+		// TODO Auto-generated method stub
+		return message;
+	}
+
+}

+ 119 - 0
src/main/java/com/neko/utils/AppJwtUtil.java

@@ -0,0 +1,119 @@
+package com.neko.utils;
+
+import io.jsonwebtoken.*;
+
+import javax.crypto.SecretKey;
+import javax.crypto.spec.SecretKeySpec;
+import java.util.*;
+
+public class AppJwtUtil {
+
+    // TOKEN的有效期一天(S)
+    private static final int TOKEN_TIME_OUT = 3_600;
+    // 加密KEY
+    private static final String TOKEN_ENCRY_KEY = "MDk4ZjZiY2Q0NjIxZDM3M2NhZGU0ZTgzMjYyN2I0ZjY";
+    // 最小刷新间隔(S)
+    private static final int REFRESH_TIME = 300;
+
+    // 生产ID
+    public static String getToken(Long id){
+        Map<String, Object> claimMaps = new HashMap<>();
+        claimMaps.put("id",id);
+        long currentTime = System.currentTimeMillis();
+        return Jwts.builder()
+                .setId(UUID.randomUUID().toString())
+                .setIssuedAt(new Date(currentTime))  //签发时间
+                .setSubject("system")  //说明
+                .setIssuer("") //签发者信息
+                .setAudience("app")  //接收用户
+                .compressWith(CompressionCodecs.GZIP)  //数据压缩方式
+                .signWith(SignatureAlgorithm.HS512, generalKey()) //加密方式
+                .setExpiration(new Date(currentTime + TOKEN_TIME_OUT * 1000))  //过期时间戳
+                .addClaims(claimMaps) //cla信息
+                .compact();
+    }
+
+    /**
+     * 获取token中的claims信息
+     *
+     * @param token
+     * @return
+     */
+    private static Jws<Claims> getJws(String token) {
+            return Jwts.parser()
+                    .setSigningKey(generalKey())
+                    .parseClaimsJws(token);
+    }
+
+    /**
+     * 获取payload body信息
+     *
+     * @param token
+     * @return
+     */
+    public static Claims getClaimsBody(String token) {
+        try {
+            return getJws(token).getBody();
+        }catch (ExpiredJwtException e){
+            return null;
+        }
+    }
+
+    /**
+     * 获取hearder body信息
+     *
+     * @param token
+     * @return
+     */
+    public static JwsHeader getHeaderBody(String token) {
+        return getJws(token).getHeader();
+    }
+
+    /**
+     * 是否过期
+     *
+     * @param claims
+     * @return -1:有效,0:有效,1:过期,2:过期
+     */
+    public static int verifyToken(Claims claims) {
+        if(claims==null){
+            return 1;
+        }
+        try {
+            claims.getExpiration()
+                    .before(new Date());
+            // 需要自动刷新TOKEN
+            if((claims.getExpiration().getTime()-System.currentTimeMillis())>REFRESH_TIME*1000){
+                return -1;
+            }else {
+                return 0;
+            }
+        } catch (ExpiredJwtException ex) {
+            return 1;
+        }catch (Exception e){
+            return 2;
+        }
+    }
+
+    /**
+     * 由字符串生成加密key
+     *
+     * @return
+     */
+    public static SecretKey generalKey() {
+        byte[] encodedKey = Base64.getEncoder().encode(TOKEN_ENCRY_KEY.getBytes());
+        SecretKey key = new SecretKeySpec(encodedKey, 0, encodedKey.length, "AES");
+        return key;
+    }
+
+    public static void main(String[] args) {
+       /* Map map = new HashMap();
+        map.put("id","11");*/
+        System.out.println(AppJwtUtil.getToken(1102L));
+        Jws<Claims> jws = AppJwtUtil.getJws("eyJhbGciOiJIUzUxMiIsInppcCI6IkdaSVAifQ.H4sIAAAAAAAAADWLQQqEMAwA_5KzhURNt_qb1KZYQSi0wi6Lf9942NsMw3zh6AVW2DYmDGl2WabkZgreCaM6VXzhFBfJMcMARTqsxIG9Z888QLui3e3Tup5Pb81013KKmVzJTGo11nf9n8v4nMUaEY73DzTabjmDAAAA.4SuqQ42IGqCgBai6qd4RaVpVxTlZIWC826QA9kLvt9d-yVUw82gU47HDaSfOzgAcloZedYNNpUcd18Ne8vvjQA");
+        Claims claims = jws.getBody();
+        System.out.println(claims.get("id"));
+
+    }
+
+}

+ 18 - 0
src/main/java/com/neko/utils/BaseExceptionEnum.java

@@ -0,0 +1,18 @@
+package com.neko.utils;
+
+/**
+ * 抽象接口
+ *
+ */
+public interface BaseExceptionEnum {
+
+    /**
+     * 获取异常编码
+     */
+    Integer getCode();
+
+    /**
+     * 获取异常信息
+     */
+    String getMessage();
+}

+ 311 - 0
src/main/java/com/neko/utils/HttpUtils.java

@@ -0,0 +1,311 @@
+package com.neko.utils;
+
+import org.apache.commons.lang.StringUtils;
+import org.apache.http.HttpResponse;
+import org.apache.http.NameValuePair;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.entity.UrlEncodedFormEntity;
+import org.apache.http.client.methods.HttpDelete;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.client.methods.HttpPut;
+import org.apache.http.conn.ClientConnectionManager;
+import org.apache.http.conn.scheme.Scheme;
+import org.apache.http.conn.scheme.SchemeRegistry;
+import org.apache.http.conn.ssl.SSLSocketFactory;
+import org.apache.http.entity.ByteArrayEntity;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.DefaultHttpClient;
+import org.apache.http.message.BasicNameValuePair;
+
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.TrustManager;
+import javax.net.ssl.X509TrustManager;
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.security.KeyManagementException;
+import java.security.NoSuchAlgorithmException;
+import java.security.cert.X509Certificate;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+public class HttpUtils {
+
+	/**
+	 * get
+	 *
+	 * @param host
+	 * @param path
+	 * @param method
+	 * @param headers
+	 * @param querys
+	 * @return
+	 * @throws Exception
+	 */
+	public static HttpResponse doGet(String host, String path, String method,
+			Map<String, String> headers,
+			Map<String, String> querys)
+            throws Exception {
+    	HttpClient httpClient = wrapClient(host);
+
+    	HttpGet request = new HttpGet(buildUrl(host, path, querys));
+        for (Map.Entry<String, String> e : headers.entrySet()) {
+        	request.addHeader(e.getKey(), e.getValue());
+        }
+
+        return httpClient.execute(request);
+    }
+
+	/**
+	 * post form
+	 *
+	 * @param host
+	 * @param path
+	 * @param method
+	 * @param headers
+	 * @param querys
+	 * @param bodys
+	 * @return
+	 * @throws Exception
+	 */
+	public static HttpResponse doPost(String host, String path, String method,
+			Map<String, String> headers,
+			Map<String, String> querys,
+			Map<String, String> bodys)
+            throws Exception {
+    	HttpClient httpClient = wrapClient(host);
+
+    	HttpPost request = new HttpPost(buildUrl(host, path, querys));
+        for (Map.Entry<String, String> e : headers.entrySet()) {
+        	request.addHeader(e.getKey(), e.getValue());
+        }
+
+        if (bodys != null) {
+            List<NameValuePair> nameValuePairList = new ArrayList<NameValuePair>();
+
+            for (String key : bodys.keySet()) {
+                nameValuePairList.add(new BasicNameValuePair(key, bodys.get(key)));
+            }
+            UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(nameValuePairList, "utf-8");
+            formEntity.setContentType("application/x-www-form-urlencoded; charset=UTF-8");
+            request.setEntity(formEntity);
+        }
+
+        return httpClient.execute(request);
+    }
+
+	/**
+	 * Post String
+	 *
+	 * @param host
+	 * @param path
+	 * @param method
+	 * @param headers
+	 * @param querys
+	 * @param body
+	 * @return
+	 * @throws Exception
+	 */
+	public static HttpResponse doPost(String host, String path, String method,
+			Map<String, String> headers,
+			Map<String, String> querys,
+			String body)
+            throws Exception {
+    	HttpClient httpClient = wrapClient(host);
+
+    	HttpPost request = new HttpPost(buildUrl(host, path, querys));
+        for (Map.Entry<String, String> e : headers.entrySet()) {
+        	request.addHeader(e.getKey(), e.getValue());
+        }
+
+        if (StringUtils.isNotBlank(body)) {
+        	request.setEntity(new StringEntity(body, "utf-8"));
+        }
+
+        return httpClient.execute(request);
+    }
+
+	/**
+	 * Post stream
+	 *
+	 * @param host
+	 * @param path
+	 * @param method
+	 * @param headers
+	 * @param querys
+	 * @param body
+	 * @return
+	 * @throws Exception
+	 */
+	public static HttpResponse doPost(String host, String path, String method,
+			Map<String, String> headers,
+			Map<String, String> querys,
+			byte[] body)
+            throws Exception {
+    	HttpClient httpClient = wrapClient(host);
+
+    	HttpPost request = new HttpPost(buildUrl(host, path, querys));
+        for (Map.Entry<String, String> e : headers.entrySet()) {
+        	request.addHeader(e.getKey(), e.getValue());
+        }
+
+        if (body != null) {
+        	request.setEntity(new ByteArrayEntity(body));
+        }
+
+        return httpClient.execute(request);
+    }
+
+	/**
+	 * Put String
+	 * @param host
+	 * @param path
+	 * @param method
+	 * @param headers
+	 * @param querys
+	 * @param body
+	 * @return
+	 * @throws Exception
+	 */
+	public static HttpResponse doPut(String host, String path, String method,
+			Map<String, String> headers,
+			Map<String, String> querys,
+			String body)
+            throws Exception {
+    	HttpClient httpClient = wrapClient(host);
+
+    	HttpPut request = new HttpPut(buildUrl(host, path, querys));
+        for (Map.Entry<String, String> e : headers.entrySet()) {
+        	request.addHeader(e.getKey(), e.getValue());
+        }
+
+        if (StringUtils.isNotBlank(body)) {
+        	request.setEntity(new StringEntity(body, "utf-8"));
+        }
+
+        return httpClient.execute(request);
+    }
+
+	/**
+	 * Put stream
+	 * @param host
+	 * @param path
+	 * @param method
+	 * @param headers
+	 * @param querys
+	 * @param body
+	 * @return
+	 * @throws Exception
+	 */
+	public static HttpResponse doPut(String host, String path, String method,
+			Map<String, String> headers,
+			Map<String, String> querys,
+			byte[] body)
+            throws Exception {
+    	HttpClient httpClient = wrapClient(host);
+
+    	HttpPut request = new HttpPut(buildUrl(host, path, querys));
+        for (Map.Entry<String, String> e : headers.entrySet()) {
+        	request.addHeader(e.getKey(), e.getValue());
+        }
+
+        if (body != null) {
+        	request.setEntity(new ByteArrayEntity(body));
+        }
+
+        return httpClient.execute(request);
+    }
+
+	/**
+	 * Delete
+	 *
+	 * @param host
+	 * @param path
+	 * @param method
+	 * @param headers
+	 * @param querys
+	 * @return
+	 * @throws Exception
+	 */
+	public static HttpResponse doDelete(String host, String path, String method,
+			Map<String, String> headers,
+			Map<String, String> querys)
+            throws Exception {
+    	HttpClient httpClient = wrapClient(host);
+
+    	HttpDelete request = new HttpDelete(buildUrl(host, path, querys));
+        for (Map.Entry<String, String> e : headers.entrySet()) {
+        	request.addHeader(e.getKey(), e.getValue());
+        }
+
+        return httpClient.execute(request);
+    }
+
+	private static String buildUrl(String host, String path, Map<String, String> querys) throws UnsupportedEncodingException {
+    	StringBuilder sbUrl = new StringBuilder();
+    	sbUrl.append(host);
+    	if (!StringUtils.isBlank(path)) {
+    		sbUrl.append(path);
+        }
+    	if (null != querys) {
+    		StringBuilder sbQuery = new StringBuilder();
+        	for (Map.Entry<String, String> query : querys.entrySet()) {
+        		if (0 < sbQuery.length()) {
+        			sbQuery.append("&");
+        		}
+        		if (StringUtils.isBlank(query.getKey()) && !StringUtils.isBlank(query.getValue())) {
+        			sbQuery.append(query.getValue());
+                }
+        		if (!StringUtils.isBlank(query.getKey())) {
+        			sbQuery.append(query.getKey());
+        			if (!StringUtils.isBlank(query.getValue())) {
+        				sbQuery.append("=");
+        				sbQuery.append(URLEncoder.encode(query.getValue(), "utf-8"));
+        			}
+                }
+        	}
+        	if (0 < sbQuery.length()) {
+        		sbUrl.append("?").append(sbQuery);
+        	}
+        }
+
+    	return sbUrl.toString();
+    }
+
+	private static HttpClient wrapClient(String host) {
+		HttpClient httpClient = new DefaultHttpClient();
+		if (host.startsWith("https://")) {
+			sslClient(httpClient);
+		}
+
+		return httpClient;
+	}
+
+	private static void sslClient(HttpClient httpClient) {
+        try {
+            SSLContext ctx = SSLContext.getInstance("TLS");
+            X509TrustManager tm = new X509TrustManager() {
+                public X509Certificate[] getAcceptedIssuers() {
+                    return null;
+                }
+                public void checkClientTrusted(X509Certificate[] xcs, String str) {
+
+                }
+                public void checkServerTrusted(X509Certificate[] xcs, String str) {
+
+                }
+            };
+            ctx.init(null, new TrustManager[] { tm }, null);
+            SSLSocketFactory ssf = new SSLSocketFactory(ctx);
+            ssf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
+            ClientConnectionManager ccm = httpClient.getConnectionManager();
+            SchemeRegistry registry = ccm.getSchemeRegistry();
+            registry.register(new Scheme("https", 443, ssf));
+        } catch (KeyManagementException ex) {
+            throw new RuntimeException(ex);
+        } catch (NoSuchAlgorithmException ex) {
+        	throw new RuntimeException(ex);
+        }
+    }
+}

+ 89 - 0
src/main/java/com/neko/utils/ResultVo.java

@@ -0,0 +1,89 @@
+package com.neko.utils;
+
+import lombok.Data;
+
+@Data
+public class ResultVo<T> {
+    private Integer code;
+    private String msg;
+    private  T obj;
+
+    public ResultVo() {}
+
+    public ResultVo(int code, String msg, T obj) {
+        this.code = code;
+        this.msg = msg;
+        this.obj = obj;
+
+    }
+
+    public ResultVo(ApiServiceExceptionEnum apiServiceExceptionEnum, T object) {
+        this.code = apiServiceExceptionEnum.getCode();
+        this.msg = apiServiceExceptionEnum.getMessage();
+        this.obj = object;
+    }
+    public ResultVo(ApiServiceExceptionEnum apiServiceExceptionEnum) {
+        this.code = apiServiceExceptionEnum.getCode();
+        this.msg = apiServiceExceptionEnum.getMessage();
+        this.obj = null;
+    }
+
+    public static ResultVo success(Object object) {
+        ResultVo resultVO = new ResultVo();
+        resultVO.setCode(200);
+        resultVO.setMsg("成功");
+        resultVO.setObj(object);
+        return resultVO;
+    }
+
+    public static ResultVo success() {
+        return success(null);
+    }
+    public static ResultVo error(Integer code, String msg) {
+        ResultVo resultVO = new ResultVo();
+        resultVO.setCode(code);
+        resultVO.setMsg(msg);
+        return resultVO;
+    }
+    public static ResultVo error(){
+        ResultVo resultVO=new ResultVo();
+        resultVO.setCode(0);
+        resultVO.setMsg("失败");
+        return resultVO;
+    }
+    public static ResultVo error(Integer code,String msg,Object obj){
+        ResultVo resultVO=new ResultVo();
+        resultVO.setCode(0);
+        resultVO.setMsg(msg);
+        resultVO.setObj(obj);
+        return resultVO;
+    }
+
+    public static ResultVo error(ApiServiceExceptionEnum apiServiceExceptionEnum) {
+        ResultVo resultVO=new ResultVo();
+        resultVO.setCode(apiServiceExceptionEnum.getCode());
+        resultVO.setMsg(apiServiceExceptionEnum.getMessage());
+        return resultVO;
+    }
+    public static ResultVo success(Integer code,String msg,Object obj){
+        ResultVo resultVO=new ResultVo();
+        resultVO.setCode(code);
+        resultVO.setMsg(msg);
+        resultVO.setObj(obj);
+        return resultVO;
+    }
+
+    public static ResultVo success(ApiServiceExceptionEnum apiServiceExceptionEnum) {
+        ResultVo resultVO=new ResultVo();
+        resultVO.setCode(apiServiceExceptionEnum.getCode());
+        resultVO.setMsg(apiServiceExceptionEnum.getMessage());
+        return resultVO;
+    }
+    public static ResultVo success(ApiServiceExceptionEnum apiServiceExceptionEnum,Object object) {
+        ResultVo resultVO=new ResultVo();
+        resultVO.setCode(apiServiceExceptionEnum.getCode());
+        resultVO.setMsg(apiServiceExceptionEnum.getMessage());
+        resultVO.setObj(object);
+        return resultVO;
+    }
+}

+ 78 - 0
src/main/java/com/neko/utils/SnowflakeUtil.java

@@ -0,0 +1,78 @@
+package com.neko.utils;
+
+/**
+ * @Date 2025/4/21 19:25
+ * @Author gln
+ **/
+
+public class SnowflakeUtil {
+    // 起始时间戳,可自定义,这里以 2020-01-01 00:00:00 为例
+    private static final long START_TIMESTAMP = 1577836800000L;
+
+    // 数据中心 ID 所占位数
+    private static final long DATA_CENTER_ID_BITS = 5L;
+    // 机器 ID 所占位数
+    private static final long WORKER_ID_BITS = 5L;
+    // 序列号所占位数
+    private static final long SEQUENCE_BITS = 12L;
+
+    // 数据中心 ID 最大值
+    private static final long MAX_DATA_CENTER_ID = -1L ^ (-1L << DATA_CENTER_ID_BITS);
+    // 机器 ID 最大值
+    private static final long MAX_WORKER_ID = -1L ^ (-1L << WORKER_ID_BITS);
+    // 序列号最大值
+    private static final long SEQUENCE_MASK = -1L ^ (-1L << SEQUENCE_BITS);
+
+    // 机器 ID 向左移位数
+    private static final long WORKER_ID_SHIFT = SEQUENCE_BITS;
+    // 数据中心 ID 向左移位数
+    private static final long DATA_CENTER_ID_SHIFT = SEQUENCE_BITS + WORKER_ID_BITS;
+    // 时间戳向左移位数
+    private static final long TIMESTAMP_LEFT_SHIFT = SEQUENCE_BITS + WORKER_ID_BITS + DATA_CENTER_ID_BITS;
+
+    // 固定数据中心 ID 和机器 ID
+    private static final long DATA_CENTER_ID = 1;
+    private static final long WORKER_ID = 1;
+
+    private static long sequence = 0L;
+    private static long lastTimestamp = -1L;
+
+    public static synchronized long nextId() {
+        long timestamp = System.currentTimeMillis();
+
+        if (timestamp < lastTimestamp) {
+            throw new RuntimeException("Clock moved backwards. Refusing to generate id for " + (lastTimestamp - timestamp) + " milliseconds");
+        }
+
+        if (timestamp == lastTimestamp) {
+            sequence = (sequence + 1) & SEQUENCE_MASK;
+            if (sequence == 0) {
+                timestamp = waitForNextMillis(lastTimestamp);
+            }
+        } else {
+            sequence = 0L;
+        }
+
+        lastTimestamp = timestamp;
+
+        return ((timestamp - START_TIMESTAMP) << TIMESTAMP_LEFT_SHIFT) |
+                (DATA_CENTER_ID << DATA_CENTER_ID_SHIFT) |
+                (WORKER_ID << WORKER_ID_SHIFT) |
+                sequence;
+    }
+
+    private static long waitForNextMillis(long lastTimestamp) {
+        long timestamp = System.currentTimeMillis();
+        while (timestamp <= lastTimestamp) {
+            timestamp = System.currentTimeMillis();
+        }
+        return timestamp;
+    }
+
+    public static void main(String[] args) {
+        for (int i = 0; i < 10; i++) {
+            System.out.println(nextId());
+        }
+    }
+}
+

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

@@ -0,0 +1,19 @@
+server:
+  port: 8888
+spring:
+  servlet:
+    multipart:
+      enabled: true
+      max-file-size: 1000MB
+      max-request-size: 1000MB
+  datasource:
+    driver-class-name: com.mysql.cj.jdbc.Driver
+    url: jdbc:mysql://47.95.170.81:3306/neko?characterEncoding=utf8&serverTimezone=GMT%2B8
+    username: cat
+    password: neko//91
+  redis:
+    host: 127.0.0.1
+    port: 6379
+mybatis-plus:
+  mapper-locations: classpath:/mapper/*.xml
+  type-aliases-package: com.neko.domain.pojo

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

@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.neko.mapper.FriendRelationMapper">
+
+    <resultMap id="BaseResultMap" type="com.neko.domain.pojo.FriendRelation">
+            <id property="id" column="id" jdbcType="BIGINT"/>
+            <result property="userId" column="user_id" jdbcType="BIGINT"/>
+            <result property="friendId" column="friend_id" jdbcType="BIGINT"/>
+            <result property="remark" column="remark" jdbcType="VARCHAR"/>
+            <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="createTime" column="create_time" jdbcType="TIMESTAMP"/>
+            <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id,user_id,friend_id,
+        remark,group_name,is_top,
+        is_mute,create_time,update_time
+    </sql>
+</mapper>

+ 22 - 0
src/main/resources/mapper/FriendRequestMapper.xml

@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.neko.mapper.FriendRequestMapper">
+
+    <resultMap id="BaseResultMap" type="com.neko.domain.pojo.FriendRequest">
+            <id property="id" column="id" jdbcType="BIGINT"/>
+            <result property="senderId" column="sender_id" jdbcType="BIGINT"/>
+            <result property="receiverId" column="receiver_id" jdbcType="BIGINT"/>
+            <result property="message" column="message" jdbcType="VARCHAR"/>
+            <result property="status" column="status" jdbcType="TINYINT"/>
+            <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
+            <result property="handledTime" column="handled_time" jdbcType="TIMESTAMP"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id,sender_id,receiver_id,
+        message,status,create_time,
+        handled_time
+    </sql>
+</mapper>

+ 30 - 0
src/main/resources/mapper/GroupInfoMapper.xml

@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.neko.mapper.GroupInfoMapper">
+
+    <resultMap id="BaseResultMap" type="com.neko.domain.pojo.GroupInfo">
+            <id property="id" column="id" jdbcType="INTEGER"/>
+            <result property="groupId" column="group_id" jdbcType="VARCHAR"/>
+            <result property="groupName" column="group_name" jdbcType="VARCHAR"/>
+            <result property="cretorId" column="cretor_id" jdbcType="BIGINT"/>
+            <result property="avatar" column="avatar" jdbcType="VARCHAR"/>
+            <result property="description" column="description" jdbcType="VARCHAR"/>
+            <result property="memberCount" column="member_count" jdbcType="INTEGER"/>
+            <result property="maxMemberCount" column="max_member_count" jdbcType="INTEGER"/>
+            <result property="status" column="status" jdbcType="TINYINT"/>
+            <result property="isPublic" column="is_public" jdbcType="TINYINT"/>
+            <result property="needApproval" column="need_approval" jdbcType="TINYINT"/>
+            <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
+            <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id,group_id,group_name,
+        cretor_id,avatar,description,
+        member_count,max_member_count,status,
+        is_public,need_approval,create_time,
+        update_time
+    </sql>
+</mapper>

+ 28 - 0
src/main/resources/mapper/GroupMemberMapper.xml

@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.neko.mapper.GroupMemberMapper">
+
+    <resultMap id="BaseResultMap" type="com.neko.domain.pojo.GroupMember">
+            <id property="id" column="id" jdbcType="BIGINT"/>
+            <result property="groupId" column="group_id" jdbcType="VARCHAR"/>
+            <result property="userId" column="user_id" jdbcType="BIGINT"/>
+            <result property="roleId" column="role_id" jdbcType="BIGINT"/>
+            <result property="nickname" column="nickname" jdbcType="VARCHAR"/>
+            <result property="joinTime" column="join_time" jdbcType="TIMESTAMP"/>
+            <result property="lastActiveTime" column="last_active_time" jdbcType="TIMESTAMP"/>
+            <result property="isMute" column="is_mute" jdbcType="TINYINT"/>
+            <result property="isTop" column="is_top" jdbcType="TINYINT"/>
+            <result property="unreadCount" column="unread_count" jdbcType="INTEGER"/>
+            <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
+            <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id,group_id,user_id,
+        role_id,nickname,join_time,
+        last_active_time,is_mute,is_top,
+        unread_count,create_time,update_time
+    </sql>
+</mapper>

+ 20 - 0
src/main/resources/mapper/GroupRoleMapper.xml

@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.neko.mapper.GroupRoleMapper">
+
+    <resultMap id="BaseResultMap" type="com.neko.domain.pojo.GroupRole">
+            <id property="id" column="id" jdbcType="BIGINT"/>
+            <result property="roleName" column="role_name" jdbcType="VARCHAR"/>
+            <result property="permissions" column="permissions" jdbcType="VARCHAR"/>
+            <result property="isSystem" column="is_system" jdbcType="TINYINT"/>
+            <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
+            <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id,role_name,permissions,
+        is_system,create_time,update_time
+    </sql>
+</mapper>

+ 26 - 0
src/main/resources/mapper/MessageContentMediaMapper.xml

@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.neko.mapper.MessageContentMediaMapper">
+
+    <resultMap id="BaseResultMap" type="com.neko.domain.pojo.MessageContentMedia">
+            <id property="id" column="id" jdbcType="INTEGER"/>
+            <result property="fileUrl" column="file_url" jdbcType="VARCHAR"/>
+            <result property="fileName" column="file_name" jdbcType="VARCHAR"/>
+            <result property="fileSize" column="file_size" jdbcType="BIGINT"/>
+            <result property="fileType" column="file_type" jdbcType="VARCHAR"/>
+            <result property="duration" column="duration" jdbcType="INTEGER"/>
+            <result property="width" column="width" jdbcType="INTEGER"/>
+            <result property="height" column="height" jdbcType="INTEGER"/>
+            <result property="thumbUrl" column="thumb_url" jdbcType="VARCHAR"/>
+            <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id,file_url,file_name,
+        file_size,file_type,duration,
+        width,height,thumb_url,
+        create_time
+    </sql>
+</mapper>

+ 18 - 0
src/main/resources/mapper/MessageContentTextMapper.xml

@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.neko.mapper.MessageContentTextMapper">
+
+    <resultMap id="BaseResultMap" type="com.neko.domain.pojo.MessageContentText">
+            <id property="id" column="id" jdbcType="INTEGER"/>
+            <result property="content" column="content" jdbcType="VARCHAR"/>
+            <result property="mentionedList" column="mentioned_list" jdbcType="VARCHAR"/>
+            <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id,content,mentioned_list,
+        create_time
+    </sql>
+</mapper>

+ 27 - 0
src/main/resources/mapper/MessageMapper.xml

@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.neko.mapper.MessageMapper">
+
+    <resultMap id="BaseResultMap" type="com.neko.domain.pojo.Message">
+            <id property="id" column="id" jdbcType="BIGINT"/>
+            <result property="messageId" column="message_id" jdbcType="VARCHAR"/>
+            <result property="senderId" column="sender_id" jdbcType="BIGINT"/>
+            <result property="receiverId" column="receiver_id" jdbcType="BIGINT"/>
+            <result property="receiverType" column="receiver_type" jdbcType="TINYINT"/>
+            <result property="messageType" column="message_type" jdbcType="TINYINT"/>
+            <result property="contentId" column="content_id" jdbcType="BIGINT"/>
+            <result property="isEncrypted" column="is_encrypted" jdbcType="TINYINT"/>
+            <result property="status" column="status" jdbcType="TINYINT"/>
+            <result property="sendTime" column="send_time" jdbcType="TIMESTAMP"/>
+            <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id,message_id,sender_id,
+        receiver_id,receiver_type,message_type,
+        content_id,is_encrypted,status,
+        send_time,create_time
+    </sql>
+</mapper>

+ 19 - 0
src/main/resources/mapper/MessageStatusMapper.xml

@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.neko.mapper.MessageStatusMapper">
+
+    <resultMap id="BaseResultMap" type="com.neko.domain.pojo.MessageStatus">
+            <id property="id" column="id" jdbcType="BIGINT"/>
+            <result property="messageId" column="message_id" jdbcType="VARCHAR"/>
+            <result property="receiverId" column="receiver_id" jdbcType="BIGINT"/>
+            <result property="status" column="status" jdbcType="TINYINT"/>
+            <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id,message_id,receiver_id,
+        status,update_time
+    </sql>
+</mapper>

+ 18 - 0
src/main/resources/mapper/OfflineMessageMapper.xml

@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.neko.mapper.OfflineMessageMapper">
+
+    <resultMap id="BaseResultMap" type="com.neko.domain.pojo.OfflineMessage">
+            <id property="id" column="id" jdbcType="BIGINT"/>
+            <result property="userId" column="user_id" jdbcType="BIGINT"/>
+            <result property="messageId" column="message_id" jdbcType="VARCHAR"/>
+            <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id,user_id,message_id,
+        create_time
+    </sql>
+</mapper>

+ 27 - 0
src/main/resources/mapper/UserDeviceMapper.xml

@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.neko.mapper.UserDeviceMapper">
+
+    <resultMap id="BaseResultMap" type="com.neko.domain.pojo.UserDevice">
+            <id property="id" column="id" jdbcType="BIGINT"/>
+            <result property="userId" column="user_id" jdbcType="BIGINT"/>
+            <result property="deviceId" column="device_id" jdbcType="VARCHAR"/>
+            <result property="deviceType" column="device_type" jdbcType="VARCHAR"/>
+            <result property="deviceModel" column="device_model" jdbcType="VARCHAR"/>
+            <result property="osVersion" column="os_version" jdbcType="VARCHAR"/>
+            <result property="appVersuib" column="app_versuib" jdbcType="VARCHAR"/>
+            <result property="pushToken" column="push_token" jdbcType="VARCHAR"/>
+            <result property="isNoline" column="is_noline" jdbcType="VARCHAR"/>
+            <result property="listActiveTime" column="list_active_time" jdbcType="TIMESTAMP"/>
+            <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id,user_id,device_id,
+        device_type,device_model,os_version,
+        app_versuib,push_token,is_noline,
+        list_active_time,create_time
+    </sql>
+</mapper>

+ 23 - 0
src/main/resources/mapper/UserLogMapper.xml

@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.neko.mapper.UserLogMapper">
+
+    <resultMap id="BaseResultMap" type="com.neko.domain.pojo.UserLog">
+            <id property="id" column="id" jdbcType="INTEGER"/>
+            <result property="userId" column="user_id" jdbcType="BIGINT"/>
+            <result property="userName" column="user_name" jdbcType="VARCHAR"/>
+            <result property="loginZhu" column="login_zhu" jdbcType="VARCHAR"/>
+            <result property="zhuIp" column="zhu_ip" jdbcType="VARCHAR"/>
+            <result property="loginTime" column="login_time" jdbcType="TIMESTAMP"/>
+            <result property="describe" column="describe" jdbcType="VARCHAR"/>
+            <result property="logoutTime" column="logout_time" jdbcType="TIMESTAMP"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id,user_id,user_name,
+        login_zhu,zhu_ip,login_time,
+        describe,logout_time
+    </sql>
+</mapper>

+ 27 - 0
src/main/resources/mapper/UserMapper.xml

@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.neko.mapper.UserMapper">
+
+    <resultMap id="BaseResultMap" type="com.neko.domain.pojo.User">
+            <id property="id" column="id" jdbcType="BIGINT"/>
+            <result property="salt" column="salt" jdbcType="VARCHAR"/>
+            <result property="username" column="username" jdbcType="VARCHAR"/>
+            <result property="password" column="password" jdbcType="VARCHAR"/>
+            <result property="phone" column="phone" jdbcType="VARCHAR"/>
+            <result property="email" column="email" jdbcType="VARCHAR"/>
+            <result property="status" column="status" jdbcType="TINYINT"/>
+            <result property="registertime" column="registerTime" jdbcType="TIMESTAMP"/>
+            <result property="registerip" column="registerIp" jdbcType="VARCHAR"/>
+            <result property="isAuthSf" column="is_auth_sf" jdbcType="TINYINT"/>
+            <result property="lastLoginTime" column="last_login_time" jdbcType="TIMESTAMP"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id,salt,username,
+        password,phone,email,
+        status,registerTime,registerIp,
+        is_auth_sf,last_login_time
+    </sql>
+</mapper>

+ 26 - 0
src/main/resources/mapper/UserProfileMapper.xml

@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.neko.mapper.UserProfileMapper">
+
+    <resultMap id="BaseResultMap" type="com.neko.domain.pojo.UserProfile">
+            <id property="id" column="id" jdbcType="BIGINT"/>
+            <result property="userId" column="user_id" jdbcType="BIGINT"/>
+            <result property="nickname" column="nickname" jdbcType="VARCHAR"/>
+            <result property="avatar" column="avatar" jdbcType="VARCHAR"/>
+            <result property="gender" column="gender" jdbcType="VARCHAR"/>
+            <result property="birthday" column="birthday" jdbcType="TIMESTAMP"/>
+            <result property="signatture" column="signatture" jdbcType="VARCHAR"/>
+            <result property="region" column="region" jdbcType="VARCHAR"/>
+            <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
+            <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id,user_id,nickname,
+        avatar,gender,birthday,
+        signatture,region,create_time,
+        update_time
+    </sql>
+</mapper>

+ 23 - 0
src/main/resources/mapper/UserRealnameAuthMapper.xml

@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.neko.mapper.UserRealnameAuthMapper">
+
+    <resultMap id="BaseResultMap" type="com.neko.domain.pojo.UserRealnameAuth">
+            <id property="id" column="id" jdbcType="BIGINT"/>
+            <result property="userId" column="user_id" jdbcType="BIGINT"/>
+            <result property="zhenName" column="zhen_name" jdbcType="VARCHAR"/>
+            <result property="sfId" column="sf_id" jdbcType="VARCHAR"/>
+            <result property="sex" column="sex" jdbcType="VARCHAR"/>
+            <result property="birthday" column="birthday" jdbcType="TIMESTAMP"/>
+            <result property="address" column="address" jdbcType="VARCHAR"/>
+            <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id,user_id,zhen_name,
+        sf_id,sex,birthday,
+        address,create_time
+    </sql>
+</mapper>

+ 13 - 0
src/test/java/com/neko/NekomimiApplicationTests.java

@@ -0,0 +1,13 @@
+package com.neko;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+class NekomimiApplicationTests {
+
+    @Test
+    void contextLoads() {
+    }
+
+}