1. 项目概述
作为一名有10年Java全栈开发经验的工程师,我最近完成了一个基于JavaWeb的社交媒体平台毕业设计项目。这个项目采用了当前主流的Spring Boot+Vue前后端分离架构,整合了MyBatis Plus、Shiro等常用框架,实现了完整的用户社交功能体系。
这个项目特别适合计算机相关专业的毕业生作为毕设选题,因为它涵盖了:
- 完整的MVC架构实现
- 主流技术栈的综合应用
- 标准的软件开发流程
- 前后端分离的开发模式
- 企业级的安全控制方案
2. 技术架构设计
2.1 整体架构设计
系统采用经典的三层架构:
- 表现层:Vue.js构建的前端界面
- 业务逻辑层:Spring Boot实现的核心业务
- 数据访问层:MyBatis Plus操作的MySQL数据库
这种分层设计使得系统具有很好的可维护性和扩展性,各层之间通过明确定义的接口进行通信,降低了耦合度。
2.2 技术选型解析
2.2.1 后端技术栈
Spring Boot 2.7.x 作为基础框架,主要考虑因素:
- 自动配置简化了初始设置
- 内嵌Tomcat便于部署
- 丰富的starter依赖简化集成
- 完善的文档和社区支持
MyBatis Plus 3.5.x 作为ORM框架的优势:
- 内置通用CRUD方法减少重复代码
- 强大的条件构造器简化复杂查询
- 分页插件开箱即用
- 性能优化良好
Shiro 1.10.x 负责安全控制:
- 简洁的认证授权API
- 灵活的权限控制策略
- 完善的会话管理
- 易于与其他框架集成
2.2.2 前端技术栈
Vue 3.x 作为前端框架的选择理由:
- 响应式数据绑定简化开发
- 组件化架构提高复用性
- 丰富的生态系统(Vuex, Vue Router等)
- 渐进式框架易于上手
Element Plus UI组件库:
- 提供丰富的预制组件
- 主题定制方便
- 良好的文档支持
- 活跃的社区维护
3. 核心功能实现
3.1 用户认证模块
3.1.1 注册功能实现
注册流程关键代码:
java复制@PostMapping("/register")
public Result register(@Valid @RequestBody UserRegisterDTO dto) {
// 验证用户名唯一性
if(userService.existsUsername(dto.getUsername())) {
throw new BusinessException("用户名已存在");
}
// 密码加密存储
User user = new User();
BeanUtils.copyProperties(dto, user);
user.setPassword(passwordEncoder.encode(dto.getPassword()));
// 设置默认角色
user.setRoles("ROLE_USER");
userService.save(user);
return Result.success();
}
安全注意事项:
- 密码必须使用BCrypt等强哈希算法加密
- 前端也需要做基本的格式校验
- 重要操作需要添加防重放机制
- 敏感信息传输必须使用HTTPS
3.1.2 登录功能实现
Shiro配置核心代码:
java复制@Bean
public ShiroFilterFactoryBean shiroFilterFactoryBean() {
ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean();
factoryBean.setSecurityManager(securityManager());
Map<String, String> filterMap = new LinkedHashMap<>();
// 匿名访问接口
filterMap.put("/api/auth/**", "anon");
// 需要认证的接口
filterMap.put("/api/**", "authc");
factoryBean.setFilterChainDefinitionMap(filterMap);
return factoryBean;
}
登录流程优化点:
- 添加验证码防止暴力破解
- 实现记住我功能
- 登录失败次数限制
- JWT token支持
3.2 社交功能模块
3.2.1 好友关系设计
数据库关系表设计:
sql复制CREATE TABLE user_relationship (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
user_id BIGINT NOT NULL,
friend_id BIGINT NOT NULL,
status TINYINT NOT NULL COMMENT '0-待确认,1-已好友,2-已拒绝',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
UNIQUE KEY uk_user_friend (user_id, friend_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
好友状态机设计:
- 发送请求 → 待确认状态
- 接受请求 → 已好友状态
- 拒绝请求 → 已拒绝状态
- 删除好友 → 移除记录
3.2.2 动态发布功能
动态表设计考虑因素:
sql复制CREATE TABLE post (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
user_id BIGINT NOT NULL,
content TEXT NOT NULL,
image_urls VARCHAR(1000),
visibility TINYINT DEFAULT 0 COMMENT '0-公开,1-好友可见,2-仅自己',
like_count INT DEFAULT 0,
comment_count INT DEFAULT 0,
create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
KEY idx_user_id (user_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
性能优化方案:
- 读写分离减轻主库压力
- 热门动态缓存到Redis
- 图片使用CDN加速
- 分库分表应对大数据量
4. 系统安全设计
4.1 权限控制系统
基于Shiro的权限控制实现:
java复制// 自定义Realm
public class CustomRealm extends AuthorizingRealm {
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
String username = (String) principals.getPrimaryPrincipal();
User user = userService.findByUsername(username);
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
// 添加角色
info.setRoles(user.getRoles());
// 添加权限
info.setStringPermissions(permissionService.getPermissions(user.getId()));
return info;
}
}
权限注解使用示例:
java复制@RequiresRoles("admin")
@PostMapping("/users")
public Result createUser(@RequestBody UserDTO dto) {
// 只有admin角色可以访问
}
@RequiresPermissions("user:delete")
@DeleteMapping("/users/{id}")
public Result deleteUser(@PathVariable Long id) {
// 需要user:delete权限
}
4.2 数据安全策略
敏感数据保护措施:
- 密码加密存储:BCryptPasswordEncoder
- 敏感信息脱敏:手机号、邮箱等
- SQL注入防护:MyBatis参数绑定
- XSS防护:前端转义+后端过滤
- CSRF防护:Token验证机制
日志审计方案:
- 关键操作日志记录
- 登录登出日志
- 数据变更日志
- 异常操作告警
5. 项目部署方案
5.1 开发环境搭建
推荐开发工具组合:
- IDE:IntelliJ IDEA Ultimate
- 数据库工具:Navicat/DBeaver
- API测试:Postman/Insomnia
- 版本控制:Git + GitLab/GitHub
Maven依赖管理关键配置:
xml复制<properties>
<java.version>1.8</java.version>
<spring-boot.version>2.7.12</spring-boot.version>
<mybatis-plus.version>3.5.3.1</mybatis-plus.version>
</properties>
<dependencies>
<!-- Spring Boot Starter -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- MyBatis Plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis-plus.version}</version>
</dependency>
<!-- 其他必要依赖 -->
</dependencies>
5.2 生产环境部署
Docker部署方案:
dockerfile复制# 后端Dockerfile
FROM openjdk:8-jdk-alpine
VOLUME /tmp
COPY target/social-media-*.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
# 前端Dockerfile
FROM nginx:alpine
COPY dist/ /usr/share/nginx/html
COPY nginx.conf /etc/nginx/conf.d/default.conf
Nginx配置示例:
nginx复制server {
listen 80;
server_name example.com;
location / {
root /usr/share/nginx/html;
try_files $uri $uri/ /index.html;
}
location /api {
proxy_pass http://backend:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
6. 项目优化方向
6.1 性能优化建议
-
缓存策略优化:
- 使用Redis缓存热点数据
- 实现多级缓存架构
- 合理设置缓存过期时间
-
数据库优化:
- 添加合适的索引
- 优化慢查询
- 考虑读写分离
- 大数据量表分库分表
-
前端性能优化:
- 组件懒加载
- 路由懒加载
- 图片懒加载
- 代码分割
6.2 功能扩展思路
-
即时通讯功能:
- 集成WebSocket
- 实现单聊/群聊
- 消息已读未读状态
-
内容推荐系统:
- 基于用户行为的推荐
- 协同过滤算法
- 热门内容推荐
-
数据分析看板:
- 用户增长分析
- 内容互动分析
- 活跃度统计
7. 常见问题解决
7.1 开发环境问题
问题1:Spring Boot启动报数据库连接错误
解决方案:
- 检查application.yml中的数据库配置
- 确认MySQL服务已启动
- 验证数据库用户名密码是否正确
- 检查网络连接是否通畅
问题2:Vue项目npm install失败
解决方案:
- 清除npm缓存:npm cache clean --force
- 删除node_modules重新安装
- 检查网络代理设置
- 尝试使用cnpm或yarn
7.2 运行时问题
问题1:跨域请求被拦截
解决方案:
java复制@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("GET", "POST", "PUT", "DELETE")
.allowedHeaders("*")
.maxAge(3600);
}
}
问题2:MyBatis Plus分页不生效
解决方案:
- 添加分页插件配置:
java复制@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
return interceptor;
}
- 确保查询参数正确传递
- 检查Page对象构造是否正确
在实际开发这个社交媒体平台的过程中,我发现有几个关键点特别值得注意:首先是一定要做好数据库设计,特别是关系型数据的关联设计;其次是安全控制要贯穿整个开发过程,不能等到最后才考虑;最后是前后端协作要定义好清晰的接口规范,这能大大减少沟通成本。