基于Spring Boot 构建现代化短视频平台:HBC Video全栈开发实战
前言
随着短视频行业的蓬勃发展,越来越多的开发者希望能够构建属于自己的短视频平台。本文将详细介绍如何使用Spring Boot 3.2.7 + Java 17 + MyBatis Plus构建一个功能完整的短视频平台系统——HBC Video。
该项目不仅包含了短视频平台的核心功能,还采用了现代化的技术栈和最佳实践,是学习全栈开发的绝佳案例。
项目概述
HBC Video是一个基于Spring Boot的现代化短视频平台,具备以下核心功能:
- 🎬 视频管理:视频上传、播放、搜索、分类
- 👥 用户系统:注册登录、个人资料、关注/粉丝
- 💬 互动功能:点赞、评论、收藏、分享
- 🔔 消息通知:系统通知、互动消息
- 👨💼 后台管理:用户管理、内容审核、数据统计
- 📱 响应式UI:现代化界面设计,支持多端适配
技术选型
后端技术栈
<!-- 核心框架 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>3.2.7</version>
</dependency>
<!-- 数据持久化 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.8</version>
</dependency>
<!-- API文档 -->
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId>
<version>4.4.0</version>
</dependency>
前端技术栈
- LayUI 2.9.18:轻量级前端框架
- 原生JavaScript:现代化ES6+语法
- 响应式设计:适配各种设备尺寸
技术选型理由
Spring Boot 3.2.7 + Java 17:
- 长期支持版本,稳定可靠
- 原生GraalVM支持,性能优异
- 完善的生态系统
MyBatis Plus:
- 强大的代码生成能力
- 丰富的内置方法
- 灵活的条件构造器
LayUI:
- 轻量级,易于上手
- 丰富的组件库
- 良好的兼容性
系统架构设计
整体架构
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ │ │ │ │ │
│ 前端展示层 │────│ 控制器层 │────│ 服务层 │
│ (LayUI) │ │ (Controller) │ │ (Service) │
│ │ │ │ │ │
└─────────────────┘ └─────────────────┘ └─────────────────┘
│
┌─────────────────┐ ┌─────────────────┐
│ │ │ │
│ 数据访问层 │────│ 数据库层 │
│ (Mapper) │ │ (MySQL) │
│ │ │ │
└─────────────────┘ └─────────────────┘
分层设计
- Controller层:处理HTTP请求,参数验证
- Service层:业务逻辑处理,事务管理
- Mapper层:数据访问操作,SQL映射
- Entity层:实体类定义,数据模型
数据库设计
核心表结构
-- 用户表
CREATE TABLE users (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) UNIQUE NOT NULL,
email VARCHAR(100) UNIQUE NOT NULL,
password VARCHAR(255) NOT NULL,
nickname VARCHAR(50),
avatar VARCHAR(255),
bio TEXT,
followers_count INT DEFAULT 0,
following_count INT DEFAULT 0,
videos_count INT DEFAULT 0,
status TINYINT DEFAULT 1,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
-- 视频表
CREATE TABLE videos (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
title VARCHAR(255) NOT NULL,
description TEXT,
video_url VARCHAR(500) NOT NULL,
cover_url VARCHAR(500),
user_id BIGINT NOT NULL,
category_id BIGINT,
duration INT,
views_count INT DEFAULT 0,
likes_count INT DEFAULT 0,
comments_count INT DEFAULT 0,
favorites_count INT DEFAULT 0,
status TINYINT DEFAULT 1,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id),
FOREIGN KEY (category_id) REFERENCES categories(id)
);
数据库设计亮点
- 合理的索引设计:为查询频繁的字段添加索引
- 外键约束:保证数据完整性
- 计数字段冗余:提高查询性能
- 软删除机制:通过status字段实现
后端开发实践
统一响应格式
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Result<T> {
private Integer code;
private String message;
private T data;
public static <T> Result<T> success(T data) {
return new Result<>(200, "操作成功", data);
}
public static <T> Result<T> error(String message) {
return new Result<>(500, message, null);
}
}
控制器层设计
@RestController
@RequestMapping("/api/videos")
@Tag(name = "视频管理", description = "视频相关API")
public class VideosController {
@Autowired
private VideosService videosService;
@PostMapping
@Operation(summary = "上传视频")
public Result<Videos> uploadVideo(@RequestBody Videos video) {
try {
Videos savedVideo = videosService.save(video);
return Result.success(savedVideo);
} catch (Exception e) {
return Result.error("视频上传失败:" + e.getMessage());
}
}
@GetMapping("/page")
@Operation(summary = "分页查询视频")
public Result<IPage<Videos>> getVideosPage(
@RequestParam(defaultValue = "1") Integer current,
@RequestParam(defaultValue = "10") Integer size,
@RequestParam(required = false) String keyword,
@RequestParam(required = false) Long categoryId) {
// 分页查询逻辑
return Result.success(page);
}
}
服务层实现
@Service
public class VideosServiceImpl extends ServiceImpl<VideosMapper, Videos> implements VideosService {
@Autowired
private UserLikesService userLikesService;
@Override
@Transactional
public boolean likeVideo(Long videoId, Long userId) {
// 检查是否已点赞
QueryWrapper<UserLikes> wrapper = new QueryWrapper<>();
wrapper.eq("user_id", userId).eq("video_id", videoId);
UserLikes existingLike = userLikesService.getOne(wrapper);
if (existingLike != null) {
// 取消点赞
userLikesService.removeById(existingLike.getId());
this.decrementLikesCount(videoId);
return false;
} else {
// 添加点赞
UserLikes userLike = new UserLikes();
userLike.setUserId(userId);
userLike.setVideoId(videoId);
userLikesService.save(userLike);
this.incrementLikesCount(videoId);
return true;
}
}
}
API接口总览
项目共实现了66个API接口,涵盖7个核心模块:
- 视频管理:12个接口(上传、查询、搜索、点赞、收藏等)
- 用户管理:14个接口(注册、登录、资料管理、关注等)
- 分类管理:7个接口(增删改查、状态管理等)
- 评论管理:7个接口(发布评论、回复、点赞等)
- 通知管理:8个接口(消息推送、已读状态等)
- 后台管理:15个接口(用户管理、内容审核、统计等)
- 系统管理:3个接口(健康检查、版本信息等)
前端开发实践
现代化UI设计
<!-- 主页面布局 -->
<div class="container">
<!-- 导航栏 -->
<nav class="navbar">
<div class="nav-left">
<img src="/images/logo.png" alt="HBC Video" class="logo">
</div>
<div class="nav-center">
<div class="search-box">
<input type="text" placeholder="搜索视频..." id="searchInput">
<button class="search-btn" onclick="searchVideos()">
<i class="layui-icon layui-icon-search"></i>
</button>
</div>
</div>
<div class="nav-right">
<div class="user-actions" id="userActions"></div>
</div>
</nav>
<!-- 内容区域 -->
<main class="main-content">
<div class="category-tabs" id="categoryTabs"></div>
<div class="video-grid" id="videoGrid"></div>
<div class="pagination" id="pagination"></div>
</main>
</div>
JavaScript模块化设计
// 公共API封装
const VideoAPI = {
// 获取视频列表
getList: async (params) => {
return await request('/api/videos/page', 'GET', params);
},
// 点赞视频
like: async (videoId) => {
return await request(`/api/videos/${videoId}/like`, 'POST');
},
// 收藏视频
favorite: async (videoId) => {
return await request(`/api/videos/${videoId}/favorite`, 'POST');
}
};
// 页面状态管理
const PageState = {
currentPage: 1,
pageSize: 12,
currentCategory: null,
searchKeyword: '',
// 重置状态
reset() {
this.currentPage = 1;
this.currentCategory = null;
this.searchKeyword = '';
}
};
响应式设计
/* 响应式网格布局 */
.video-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
gap: 20px;
padding: 20px;
}
/* 移动端适配 */
@media (max-width: 768px) {
.video-grid {
grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
gap: 15px;
padding: 15px;
}
.navbar {
flex-direction: column;
padding: 10px;
}
.search-box {
width: 100%;
margin: 10px 0;
}
}
项目亮点
1. 现代化技术栈
- 采用Spring Boot 3.2.7 + Java 17,享受最新特性
- 使用MyBatis Plus简化数据操作
- 集成Knife4j提供美观的API文档
2. 完整的业务功能
- 实现了短视频平台的所有核心功能
- 支持用户互动、内容管理、消息通知
- 提供完善的后台管理系统
3. 优秀的代码质量
- 分层架构清晰,职责分明
- 统一的异常处理和响应格式
- 完善的参数验证和错误处理
4. 现代化前端设计
- 响应式布局,适配多端设备
- 模块化JavaScript代码
- 优秀的用户体验设计
5. 可扩展性强
- 松耦合的系统设计
- 易于添加新功能模块
- 支持分布式部署
部署与运行
- 环境要求
- JDK 17+
- MySQL 8.0+
- Maven 3.6+
- 数据库配置
-- 创建数据库
CREATE DATABASE hbc_video CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 导入数据表
mysql -u root -p hbc_video < short_video_platform.sql
- 修改配置
# application.yml
spring:
datasource:
url: jdbc:mysql://localhost:3306/hbc_video
username: your_username
password: your_password
- 启动项目
mvn spring-boot:run
- 访问系统
- 前台首页:http://localhost:8080
- API文档:http://localhost:8080/doc.html
运行效果
总结
HBC Video项目展示了如何使用现代化技术栈构建一个功能完整的短视频平台。通过本项目的学习,您可以掌握:
- Spring Boot 3.2.7的核心特性和最佳实践
- MyBatis Plus的高级使用技巧
- 前后端分离的开发模式
- 响应式Web设计的实现方法
- RESTful API的设计原则
该项目不仅适合作为学习案例,也可以作为实际项目的基础框架进行扩展。希望这个项目能够帮助更多的开发者理解和掌握现代化Web开发技术。
关键词: Spring Boot 3.2.7, Java 17, MyBatis Plus, 短视频平台, 全栈开发, LayUI, 响应式设计, RESTful API
标签: #SpringBoot #Java #短视频 #全栈开发 #MyBatisPlus #LayUI