1. 项目概述与技术选型
这个基于SSM框架的视频分享管理系统是我在2023年完成的一个毕业设计项目,主要面向教育机构和兴趣社区等垂直场景。系统采用经典的Java Web技术栈,后端使用Spring+SpringMVC+MyBatis三大框架组合,前端基于Vue.js构建响应式界面,数据库选用MySQL 5.7。
选择SSM框架组合主要基于三个考虑:首先,Spring的IoC容器和AOP编程模型能很好地管理业务组件和事务;其次,SpringMVC提供了清晰的MVC分层结构,便于前后端协作开发;最后,MyBatis的SQL映射方式相比Hibernate更灵活,适合需要精细控制SQL的场景。这种技术组合在中小型Web应用中非常成熟稳定,社区资源丰富,遇到问题容易找到解决方案。
2. 系统架构设计
2.1 整体架构
系统采用典型的分层架构设计:
- 表现层:Vue.js前端框架 + Element UI组件库
- Web层:SpringMVC处理HTTP请求和响应
- 业务层:Spring管理的Service组件
- 持久层:MyBatis + MySQL数据库
- 存储层:本地文件系统存储视频文件
这种分层设计使得各层职责明确,便于团队协作和后期维护。例如,当需要更换前端框架时,只需保证接口协议不变,业务层和持久层代码完全不需要修改。
2.2 数据库设计
数据库设计遵循第三范式,主要包含以下核心表:
- 用户表(user):存储用户基本信息、账号状态等
- 视频分类表(category):采用parent_id自关联设计,支持无限级分类
- 视频表(video):存储视频元信息,通过file_path关联实际视频文件
- 分享记录表(share):记录分享行为,包含分享类型、有效期等
- 公告表(notice):管理系统公告信息
特别说明视频分类表的设计:
sql复制CREATE TABLE `category` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
`parent_id` int(11) DEFAULT NULL,
`sort` int(11) DEFAULT '0',
`icon` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_parent` (`parent_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
这种设计通过parent_id字段建立分类间的父子关系,配合递归查询算法,可以灵活地实现多级分类管理。
3. 核心功能实现
3.1 视频上传与存储方案
视频文件存储是系统的关键技术难点之一。经过对比测试,最终采用"数据库存储元数据+本地磁盘存储文件"的方案:
- 前端使用Vue的el-upload组件实现分块上传,支持大文件断点续传
- 后端接收文件后,使用FFmpeg工具生成视频缩略图
- 文件存储路径采用"年/月/日"的目录结构,避免单个目录文件过多
- 视频元信息存入数据库,包括文件大小、时长、分辨率等
关键代码片段:
java复制@PostMapping("/upload")
public Result uploadVideo(@RequestParam("file") MultipartFile file,
Video video) {
// 校验文件类型和大小
if (!isVideoFile(file)) {
return Result.error("仅支持MP4/AVI/MOV格式");
}
// 生成存储路径
String relativePath = FileUtils.generatePath(file.getOriginalFilename());
File dest = new File(uploadPath + relativePath);
// 保存文件
file.transferTo(dest);
// 生成缩略图
String thumbnail = VideoUtils.generateThumbnail(dest);
// 保存视频信息
video.setFilePath(relativePath);
video.setThumbnail(thumbnail);
videoMapper.insert(video);
return Result.success(video.getId());
}
3.2 视频分类管理
分类管理采用树形结构设计,前端使用Element UI的el-tree组件展示。关键技术点包括:
- 后端提供递归查询接口,返回完整的分类树
- 支持拖拽排序,实时更新sort字段
- 分类删除时检查是否被视频引用
- 使用Redis缓存分类数据,减轻数据库压力
分类树查询的核心SQL:
xml复制<select id="selectCategoryTree" resultMap="categoryTreeResultMap">
WITH RECURSIVE cte AS (
SELECT * FROM category WHERE parent_id IS NULL
UNION ALL
SELECT c.* FROM category c JOIN cte ON c.parent_id = cte.id
)
SELECT * FROM cte ORDER BY sort ASC
</select>
4. 关键技术实现
4.1 SSM框架整合
SSM框架整合是项目的基础工程,主要配置包括:
- Spring配置:
xml复制<!-- 开启注解扫描 -->
<context:component-scan base-package="com.qievideo"/>
<!-- 配置事务管理器 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 开启注解事务 -->
<tx:annotation-driven/>
- SpringMVC配置:
java复制@Configuration
@EnableWebMvc
@ComponentScan("com.qievideo.controller")
public class WebConfig implements WebMvcConfigurer {
// 配置静态资源处理
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/videos/**")
.addResourceLocations("file:/data/videos/");
}
}
- MyBatis配置:
properties复制# mybatis配置
mybatis.mapper-locations=classpath:mapper/*.xml
mybatis.type-aliases-package=com.qievideo.entity
4.2 JWT认证实现
系统采用JWT进行无状态认证,主要流程:
- 用户登录成功后生成JWT token
- 前端将token存储在localStorage中
- 每次请求携带token在Authorization头中
- 后端通过拦截器校验token有效性
核心代码:
java复制public class JwtInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception {
String token = request.getHeader("Authorization");
try {
Claims claims = JwtUtils.parseToken(token);
request.setAttribute("userId", claims.getSubject());
return true;
} catch (Exception e) {
response.setStatus(401);
return false;
}
}
}
5. 系统优化与安全
5.1 性能优化措施
- 视频播放优化:
- 使用HLS协议实现自适应码率
- 配置Nginx缓存静态资源
- 前端实现预加载和缓冲策略
- 数据库优化:
- 为常用查询字段添加索引
- 使用连接池管理数据库连接
- 复杂查询使用MyBatis二级缓存
- 前端优化:
- 组件按需加载
- 使用keep-alive缓存常用组件
- 图片懒加载
5.2 安全防护方案
- 上传安全:
- 校验文件类型和内容
- 限制文件大小
- 扫描病毒文件
- 接口安全:
- CSRF防护
- XSS过滤
- 接口限流
- 数据安全:
- 敏感字段加密存储
- 数据库定期备份
- 操作日志审计
6. 部署与测试
6.1 系统部署流程
- 环境准备:
bash复制# 安装JDK
yum install java-1.8.0-openjdk-devel
# 安装MySQL
wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm
rpm -ivh mysql57-community-release-el7-11.noarch.rpm
yum install mysql-community-server
# 安装Tomcat
tar -zxvf apache-tomcat-7.0.107.tar.gz
- 数据库初始化:
sql复制CREATE DATABASE qievideo DEFAULT CHARACTER SET utf8mb4;
GRANT ALL PRIVILEGES ON qievideo.* TO 'video'@'%' IDENTIFIED BY 'Video@123';
FLUSH PRIVILEGES;
- 应用部署:
bash复制# 打包应用
mvn clean package -Dmaven.test.skip=true
# 部署war包
cp target/qievideo.war /opt/tomcat/webapps/
6.2 测试方案
- 单元测试:
- 使用JUnit测试Service层
- 使用MockMvc测试Controller
- 测试覆盖率不低于70%
- 集成测试:
- 测试各模块协同工作
- 测试异常流程处理
- 测试边界条件
- 性能测试:
- 使用JMeter模拟并发请求
- 测试视频上传和播放性能
- 监控系统资源使用情况
7. 开发经验总结
在开发过程中,有几个关键点值得特别注意:
- 视频处理方面:
- FFmpeg的路径在不同操作系统下需要适配
- 视频转码耗时较长,建议使用异步处理
- 缩略图生成要考虑不同视频比例
- 分类管理方面:
- 递归查询要注意性能问题,层级不宜过深
- 前端树形组件大数据量时要使用虚拟滚动
- 分类删除时要处理好关联数据
- 分享功能方面:
- 私密分享的提取码要足够随机
- 分享链接有效期要明确提示用户
- 要考虑分享后被删除视频的处理
这个项目让我对SSM框架的整合应用有了更深入的理解,特别是在处理大文件上传和复杂业务逻辑方面积累了不少实战经验。系统虽然已经实现了基本功能,但还有不少可以优化的地方,比如引入消息队列处理视频转码、增加更多维度的数据分析等。