1. 项目背景与核心需求
在当今数字化社交时代,交友系统已经从简单的信息匹配平台发展为集智能推荐、即时通讯、兴趣社区于一体的综合性社交网络。基于SpringBoot和Java技术栈构建的B/S架构交友系统,能够满足现代年轻人对高效、安全、个性化社交体验的需求。
这个毕业设计项目的核心价值在于:
- 采用主流的SpringBoot框架,符合企业级开发标准
- 使用MySQL关系型数据库,确保数据完整性和安全性
- 实现B/S架构,用户无需安装客户端即可使用
- 整合现代交友系统的核心功能模块
提示:选择SpringBoot作为基础框架时,建议使用2.7.x稳定版本而非最新的3.x系列,因为毕业设计项目更看重稳定性和社区支持度。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 系统架构设计
2.1 技术选型分析
后端技术栈:
- SpringBoot 2.7.15(长期支持版本)
- Spring Security(认证授权)
- MyBatis-Plus 3.5.3(数据持久层)
- Redis 6.2(缓存和会话管理)
- WebSocket(实时通讯)
前端技术栈:
- Vue.js 3.x(前端框架)
- Element Plus(UI组件库)
- Axios(HTTP客户端)
数据库:
- MySQL 8.0(主数据库)
- MongoDB 6.0(非结构化数据存储)
2.2 系统模块划分
-
用户中心模块
- 注册/登录(含第三方登录)
- 个人资料管理
- 隐私设置
-
匹配推荐模块
- 基础条件筛选
- 智能算法推荐
- 附近的人
-
即时通讯模块
- 一对一聊天
- 群组聊天
- 消息状态管理
-
动态社区模块
- 图文发布
- 点赞评论
- 话题讨论
-
系统管理模块
- 用户管理
- 内容审核
- 数据统计
3. 数据库设计与实现
3.1 核心表结构
用户表(user):
sql复制CREATE TABLE `user` (
`id` bigint NOT NULL AUTO_INCREMENT,
`username` varchar(50) NOT NULL COMMENT '登录账号',
`password` varchar(100) NOT NULL COMMENT '加密密码',
`nickname` varchar(50) DEFAULT NULL COMMENT '显示名称',
`avatar` varchar(255) DEFAULT NULL COMMENT '头像URL',
`gender` tinyint DEFAULT '0' COMMENT '0未知 1男 2女',
`birthday` date DEFAULT NULL COMMENT '生日',
`location` varchar(100) DEFAULT NULL COMMENT '所在地',
`introduction` text COMMENT '个人简介',
`status` tinyint DEFAULT '1' COMMENT '状态 0禁用 1正常',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `idx_username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
好友关系表(friend_relation):
sql复制CREATE TABLE `friend_relation` (
`id` bigint NOT NULL AUTO_INCREMENT,
`user_id` bigint NOT NULL COMMENT '用户ID',
`friend_id` bigint NOT NULL COMMENT '好友ID',
`relation_status` tinyint NOT NULL COMMENT '0待确认 1好友 2拉黑',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `idx_user_friend` (`user_id`,`friend_id`),
KEY `idx_friend_user` (`friend_id`,`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
3.2 数据库优化实践
-
索引设计原则:
- 为所有外键字段创建索引
- 为高频查询条件创建复合索引
- 避免过度索引影响写入性能
-
分表策略:
- 用户聊天记录按月分表
- 用户动态按用户ID哈希分表
-
缓存策略:
- 用户基础信息缓存24小时
- 好友列表缓存1小时
- 热门动态缓存30分钟
4. 核心功能实现
4.1 用户认证与授权
基于Spring Security的JWT实现方案:
java复制@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private JwtAuthenticationFilter jwtAuthenticationFilter;
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.authorizeRequests()
.antMatchers("/api/auth/**").permitAll()
.antMatchers("/api/user/register").permitAll()
.antMatchers("/websocket/**").permitAll()
.anyRequest().authenticated();
http.addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class);
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
4.2 智能推荐算法实现
基于用户标签的协同过滤算法:
java复制public List<User> recommendUsers(Long userId, int size) {
// 1. 获取目标用户标签
List<UserTag> userTags = userTagMapper.selectByUserId(userId);
// 2. 找出有相似标签的其他用户
Map<Long, Integer> similarityScores = new HashMap<>();
for (UserTag tag : userTags) {
List<UserTag> sameTags = userTagMapper.selectByTagId(tag.getTagId());
sameTags.forEach(t -> {
if (!t.getUserId().equals(userId)) {
similarityScores.merge(t.getUserId(), 1, Integer::sum);
}
});
}
// 3. 按相似度排序并过滤已建立关系的用户
List<Long> friendIds = friendRelationMapper.selectFriendIds(userId);
return similarityScores.entrySet().stream()
.filter(e -> !friendIds.contains(e.getKey()))
.sorted(Map.Entry.<Long, Integer>comparingByValue().reversed())
.limit(size)
.map(e -> userMapper.selectById(e.getKey()))
.collect(Collectors.toList());
}
4.3 WebSocket实时通讯
基于Spring的WebSocket实现:
java复制@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker("/queue", "/topic");
config.setApplicationDestinationPrefixes("/app");
config.setUserDestinationPrefix("/user");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/ws")
.setAllowedOrigins("*")
.withSockJS();
}
@Override
public void configureClientInboundChannel(ChannelRegistration registration) {
registration.interceptors(new AuthChannelInterceptor());
}
}
5. 项目部署与优化
5.1 多环境配置
使用Spring Profile管理不同环境配置:
application-dev.properties(开发环境):
properties复制spring.datasource.url=jdbc:mysql://localhost:3306/dating_dev
spring.datasource.username=dev_user
spring.datasource.password=dev123
spring.redis.host=localhost
application-prod.properties(生产环境):
properties复制spring.datasource.url=jdbc:mysql://prod-db:3306/dating_prod?useSSL=true
spring.datasource.username=prod_user
spring.datasource.password=prod@1234
spring.redis.host=redis-cluster
spring.redis.timeout=5000
5.2 性能优化方案
-
接口层面:
- 添加二级缓存(Caffeine + Redis)
- 启用Gzip压缩
- 使用@Async异步处理非核心逻辑
-
数据库层面:
- 配置连接池(HikariCP)
- 读写分离(主从架构)
- 慢查询监控
-
前端优化:
- 组件懒加载
- 路由懒加载
- 图片懒加载+CDN加速
6. 常见问题与解决方案
6.1 跨域问题处理
SpringBoot全局跨域配置:
java复制@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
.allowedHeaders("*")
.exposedHeaders("Authorization")
.allowCredentials(true)
.maxAge(3600);
}
}
6.2 文件上传大小限制
调整SpringBoot默认配置:
application.properties:
properties复制spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=20MB
6.3 事务管理注意事项
java复制@Service
@Transactional(rollbackFor = Exception.class)
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Autowired
private UserDetailMapper userDetailMapper;
@Override
public void completeProfile(Long userId, UserDetail detail) {
// 更新基础信息
User user = new User();
user.setId(userId);
user.setNickname(detail.getNickname());
userMapper.updateById(user);
// 保存详细信息
detail.setUserId(userId);
userDetailMapper.insert(detail);
// 如果抛出异常,两个操作都会回滚
}
}
注意:在SpringBoot中,默认情况下只有RuntimeException会触发回滚,如果需要检查异常也触发回滚,必须明确指定rollbackFor属性。
7. 毕业设计扩展建议
-
增加智能算法:
- 集成HanLP分词实现兴趣标签自动提取
- 使用协同过滤算法优化推荐效果
-
增强安全机制:
- 敏感信息加密存储
- 接口防刷限流
- 内容安全审核(文本+图片)
-
监控与运维:
- 集成Prometheus监控
- 添加健康检查端点
- 实现日志集中管理(ELK)
-
移动端适配:
- 开发React Native跨平台应用
- 实现PWA渐进式Web应用
-
测试覆盖:
- 编写单元测试(JUnit5)
- 接口测试(Postman)
- 压力测试(JMeter)
在实际开发过程中,我发现交友系统最关键的三个技术点是:实时通讯的稳定性、推荐算法的准确性以及数据的安全性。特别是在处理WebSocket连接时,需要特别注意断线重连和消息可靠投递机制。我采用的解决方案是客户端定时发送心跳包,服务端维护消息队列确保离线消息不丢失。
