本文目录导读:

我来为您设计一个完整的Java点播系统案例,包含用户点播视频的核心功能。
系统架构设计
点播系统
├── 实体类 (entity)
├── 数据访问层 (DAO)
├── 业务逻辑层 (Service)
├── 控制层 (Controller)
└── 工具类 (util)
核心代码实现
实体类
// Video.java
package com.vod.entity;
import java.util.Date;
public class Video {
private Long id;
private String title;
private String description;
private String category;
private String videoUrl;
private String coverImage;
private Double price;
private Integer duration; // 视频时长(秒)
private Integer playCount;
private Integer status; // 1-上架 0-下架
private Date createdAt;
private Date updatedAt;
// 构造器
public Video() {}
public Video(Long id, String title, String description, String category,
String videoUrl, String coverImage, Double price, Integer duration) {
this.id = id;
this.title = title;
this.description = description;
this.category = category;
this.videoUrl = videoUrl;
this.coverImage = coverImage;
this.price = price;
this.duration = duration;
this.playCount = 0;
this.status = 1;
this.createdAt = new Date();
this.updatedAt = new Date();
}
// Getter和Setter方法
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
public String getTitle() { return title; }
public void setTitle(String title) { this.title = title; }
public String getDescription() { return description; }
public void setDescription(String description) { this.description = description; }
public String getCategory() { return category; }
public void setCategory(String category) { this.category = category; }
public String getVideoUrl() { return videoUrl; }
public void setVideoUrl(String videoUrl) { this.videoUrl = videoUrl; }
public String getCoverImage() { return coverImage; }
public void setCoverImage(String coverImage) { this.coverImage = coverImage; }
public Double getPrice() { return price; }
public void setPrice(Double price) { this.price = price; }
public Integer getDuration() { return duration; }
public void setDuration(Integer duration) { this.duration = duration; }
public Integer getPlayCount() { return playCount; }
public void setPlayCount(Integer playCount) { this.playCount = playCount; }
public Integer getStatus() { return status; }
public void setStatus(Integer status) { this.status = status; }
public Date getCreatedAt() { return createdAt; }
public void setCreatedAt(Date createdAt) { this.createdAt = createdAt; }
public Date getUpdatedAt() { return updatedAt; }
public void setUpdatedAt(Date updatedAt) { this.updatedAt = updatedAt; }
@Override
public String toString() {
return "Video{id=" + id + ", title='" + title + "', category='" + category +
"', price=" + price + ", playCount=" + playCount + "}";
}
}
// User.java
package com.vod.entity;
import java.util.Date;
import java.util.List;
public class User {
private Long id;
private String username;
private String password;
private String nickname;
private String email;
private String phone;
private Date registerDate;
private Integer vipLevel; // 0-普通用户 1-VIP
private List<Long> purchasedVideoIds; // 已购买视频ID列表
public User() {}
public User(String username, String password, String nickname, String email, String phone) {
this.username = username;
this.password = password;
this.nickname = nickname;
this.email = email;
this.phone = phone;
this.registerDate = new Date();
this.vipLevel = 0;
}
// Getter和Setter方法
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
public String getUsername() { return username; }
public void setUsername(String username) { this.username = username; }
public String getPassword() { return password; }
public void setPassword(String password) { this.password = password; }
public String getNickname() { return nickname; }
public void setNickname(String nickname) { this.nickname = nickname; }
public String getEmail() { return email; }
public void setEmail(String email) { this.email = email; }
public String getPhone() { return phone; }
public void setPhone(String phone) { this.phone = phone; }
public Date getRegisterDate() { return registerDate; }
public void setRegisterDate(Date registerDate) { this.registerDate = registerDate; }
public Integer getVipLevel() { return vipLevel; }
public void setVipLevel(Integer vipLevel) { this.vipLevel = vipLevel; }
public List<Long> getPurchasedVideoIds() { return purchasedVideoIds; }
public void setPurchasedVideoIds(List<Long> purchasedVideoIds) { this.purchasedVideoIds = purchasedVideoIds; }
}
// PlayRecord.java
package com.vod.entity;
import java.util.Date;
public class PlayRecord {
private Long id;
private Long userId;
private Long videoId;
private Integer progress; // 播放进度(秒)
private Date playTime;
private Date lastPlayTime;
private Integer playCount;
public PlayRecord() {}
public PlayRecord(Long userId, Long videoId) {
this.userId = userId;
this.videoId = videoId;
this.progress = 0;
this.playTime = new Date();
this.lastPlayTime = new Date();
this.playCount = 1;
}
// Getter和Setter方法
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
public Long getUserId() { return userId; }
public void setUserId(Long userId) { this.userId = userId; }
public Long getVideoId() { return videoId; }
public void setVideoId(Long videoId) { this.videoId = videoId; }
public Integer getProgress() { return progress; }
public void setProgress(Integer progress) { this.progress = progress; }
public Date getPlayTime() { return playTime; }
public void setPlayTime(Date playTime) { this.playTime = playTime; }
public Date getLastPlayTime() { return lastPlayTime; }
public void setLastPlayTime(Date lastPlayTime) { this.lastPlayTime = lastPlayTime; }
public Integer getPlayCount() { return playCount; }
public void setPlayCount(Integer playCount) { this.playCount = playCount; }
}
数据访问层 (DAO)
// VideoDAO.java
package com.vod.dao;
import com.vod.entity.Video;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
public class VideoDAO {
private static List<Video> videos = new ArrayList<>();
private static Long idCounter = 1L;
// 静态初始化一些测试数据
static {
// 添加示例数据
videos.add(new Video(idCounter++, "Java基础教程", "从零开始学习Java编程基础",
"编程", "/videos/java-tutorial.mp4", "/images/java.jpg", 99.9, 3600));
videos.add(new Video(idCounter++, "MySQL数据库实战", "MySQL数据库设计与优化",
"数据库", "/videos/mysql-course.mp4", "/images/mysql.jpg", 129.9, 5400));
videos.add(new Video(idCounter++, "Spring Boot入门到精通", "Spring Boot快速开发企业级应用",
"框架", "/videos/spring-boot.mp4", "/images/spring.jpg", 199.9, 7200));
}
// 添加视频
public Video save(Video video) {
if (video.getId() == null) {
video.setId(idCounter++);
videos.add(video);
} else {
// 更新已有视频
deleteById(video.getId());
videos.add(video);
}
return video;
}
// 根据ID查询视频
public Optional<Video> findById(Long id) {
return videos.stream()
.filter(v -> v.getId().equals(id))
.findFirst();
}
// 查询所有视频
public List<Video> findAll() {
return new ArrayList<>(videos);
}
// 根据分类查询
public List<Video> findByCategory(String category) {
return videos.stream()
.filter(v -> v.getCategory().equals(category))
.collect(Collectors.toList());
}
// 根据标题搜索
public List<Video> searchByTitle(String keyword) {
return videos.stream()
.filter(v -> v.getTitle().contains(keyword))
.collect(Collectors.toList());
}
// 删除视频
public boolean deleteById(Long id) {
return videos.removeIf(v -> v.getId().equals(id));
}
// 更新播放次数
public void incrementPlayCount(Long id) {
findById(id).ifPresent(v -> {
v.setPlayCount(v.getPlayCount() + 1);
});
}
}
// UserDAO.java
package com.vod.dao;
import com.vod.entity.User;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
public class UserDAO {
private static List<User> users = new ArrayList<>();
private static Long idCounter = 1L;
// 注册用户
public User register(User user) {
user.setId(idCounter++);
users.add(user);
return user;
}
// 根据用户名查找用户
public Optional<User> findByUsername(String username) {
return users.stream()
.filter(u -> u.getUsername().equals(username))
.findFirst();
}
// 用户登录验证
public Optional<User> login(String username, String password) {
return users.stream()
.filter(u -> u.getUsername().equals(username) && u.getPassword().equals(password))
.findFirst();
}
// 根据ID查找用户
public Optional<User> findById(Long id) {
return users.stream()
.filter(u -> u.getId().equals(id))
.findFirst();
}
// 更新用户信息
public void update(User user) {
users.removeIf(u -> u.getId().equals(user.getId()));
users.add(user);
}
// 购买视频
public boolean purchaseVideo(Long userId, Long videoId) {
Optional<User> userOpt = findById(userId);
if (userOpt.isPresent()) {
User user = userOpt.get();
if (user.getPurchasedVideoIds() == null) {
user.setPurchasedVideoIds(new ArrayList<>());
}
if (!user.getPurchasedVideoIds().contains(videoId)) {
user.getPurchasedVideoIds().add(videoId);
update(user);
return true;
}
}
return false;
}
// 检查用户是否已购买视频
public boolean hasPurchased(Long userId, Long videoId) {
Optional<User> userOpt = findById(userId);
return userOpt.map(user -> user.getPurchasedVideoIds() != null
&& user.getPurchasedVideoIds().contains(videoId)).orElse(false);
}
}
业务逻辑层 (Service)
// VideoService.java
package com.vod.service;
import com.vod.dao.VideoDAO;
import com.vod.entity.Video;
import java.util.List;
import java.util.Optional;
public class VideoService {
private VideoDAO videoDAO;
public VideoService() {
this.videoDAO = new VideoDAO();
}
// 上传视频
public Video uploadVideo(Video video) {
if (video.getTitle() == null || video.getTitle().isEmpty()) {
throw new IllegalArgumentException("视频标题不能为空");
}
if (video.getVideoUrl() == null || video.getVideoUrl().isEmpty()) {
throw new IllegalArgumentException("视频URL不能为空");
}
return videoDAO.save(video);
}
// 获取所有上架视频
public List<Video> getAvailableVideos() {
return videoDAO.findAll().stream()
.filter(v -> v.getStatus() == 1)
.toList();
}
// 根据分类获取视频
public List<Video> getVideosByCategory(String category) {
return videoDAO.findByCategory(category);
}
// 搜索视频
public List<Video> searchVideos(String keyword) {
if (keyword == null || keyword.trim().isEmpty()) {
return getAvailableVideos();
}
return videoDAO.searchByTitle(keyword.trim());
}
// 获取视频详情
public Optional<Video> getVideoDetail(Long videoId) {
return videoDAO.findById(videoId);
}
// 播放视频并增加播放次数
public String playVideo(Long videoId) {
Optional<Video> videoOpt = videoDAO.findById(videoId);
if (videoOpt.isPresent()) {
Video video = videoOpt.get();
if (video.getStatus() == 0) {
return "视频已下架";
}
videoDAO.incrementPlayCount(videoId);
return video.getVideoUrl();
}
return "视频不存在";
}
// 更新视频信息
public void updateVideo(Video video) {
videoDAO.save(video);
}
// 上下架视频
public void changeStatus(Long videoId, Integer status) {
videoDAO.findById(videoId).ifPresent(v -> {
v.setStatus(status);
videoDAO.save(v);
});
}
}
// UserService.java
package com.vod.service;
import com.vod.dao.UserDAO;
import com.vod.entity.User;
import java.util.Optional;
public class UserService {
private UserDAO userDAO;
public UserService() {
this.userDAO = new UserDAO();
}
// 用户注册
public User register(String username, String password, String nickname,
String email, String phone) {
// 验证用户名是否已存在
if (userDAO.findByUsername(username).isPresent()) {
throw new RuntimeException("用户名已存在");
}
// 基本验证
if (username == null || username.length() < 3) {
throw new RuntimeException("用户名长度至少3位");
}
if (password == null || password.length() < 6) {
throw new RuntimeException("密码长度至少6位");
}
User user = new User(username, password, nickname, email, phone);
return userDAO.register(user);
}
// 用户登录
public User login(String username, String password) {
Optional<User> userOpt = userDAO.login(username, password);
if (userOpt.isPresent()) {
return userOpt.get();
} else {
throw new RuntimeException("用户名或密码错误");
}
}
// 购买视频
public boolean purchaseVideo(Long userId, Long videoId) {
return userDAO.purchaseVideo(userId, videoId);
}
// 检查用户是否可以播放视频
public boolean canPlay(Long userId, Long videoId, boolean isVipOnly) {
if (!isVipOnly) {
return true; // 免费视频,直接播放
}
Optional<User> userOpt = userDAO.findById(userId);
if (userOpt.isPresent()) {
User user = userOpt.get();
// VIP用户或已购买视频
return user.getVipLevel() > 0 || userDAO.hasPurchased(userId, videoId);
}
return false;
}
// 获取用户信息
public Optional<User> getUserInfo(Long userId) {
return userDAO.findById(userId);
}
// 升级VIP
public void upgradeVip(Long userId) {
userDAO.findById(userId).ifPresent(user -> {
user.setVipLevel(1);
userDAO.update(user);
});
}
}
控制层 (Controller/API)
// vodController.java
package com.vod.controller;
import com.vod.entity.Video;
import com.vod.entity.User;
import com.vod.service.UserService;
import com.vod.service.VideoService;
import java.util.List;
import java.util.Optional;
import java.util.Scanner;
public class VodController {
private Scanner scanner;
private VideoService videoService;
private UserService userService;
private User currentUser;
public VodController() {
scanner = new Scanner(System.in);
videoService = new VideoService();
userService = new UserService();
}
// 主菜单
public void showMainMenu() {
while (true) {
System.out.println("\n========== 点播系统 ==========");
System.out.println("1. 视频浏览");
System.out.println("2. 视频搜索");
System.out.println("3. 视频分类");
System.out.println("4. 播放视频");
System.out.println("5. 用户登录");
System.out.println("6. 用户注册");
System.out.println("7. 购买视频");
System.out.println("8. 我的历史记录");
System.out.println("9. 退出系统");
System.out.print("请选择操作:");
int choice = scanner.nextInt();
scanner.nextLine(); // 清除缓冲区
switch (choice) {
case 1:
showAllVideos();
break;
case 2:
searchVideos();
break;
case 3:
showVideosByCategory();
break;
case 4:
playVideo();
break;
case 5:
login();
break;
case 6:
register();
break;
case 7:
purchaseVideo();
break;
case 8:
showPlayHistory();
break;
case 9:
System.out.println("感谢使用点播系统,再见!");
return;
default:
System.out.println("无效的选择,请重新选择!");
}
}
}
// 显示所有视频
private void showAllVideos() {
System.out.println("\n===== 所有视频 =====");
List<Video> videos = videoService.getAvailableVideos();
displayVideoList(videos);
}
// 搜索视频
private void searchVideos() {
System.out.print("请输入搜索关键词:");
String keyword = scanner.nextLine();
List<Video> videos = videoService.searchVideos(keyword);
if (videos.isEmpty()) {
System.out.println("没有找到相关视频");
} else {
System.out.println("\n===== 搜索结果 =====");
displayVideoList(videos);
}
}
// 按分类显示视频
private void showVideosByCategory() {
System.out.println("选择分类:");
System.out.println("1. 编程");
System.out.println("2. 数据库");
System.out.println("3. 框架");
System.out.print("请输入分类编号:");
int choice = scanner.nextInt();
scanner.nextLine();
String category = switch (choice) {
case 1 -> "编程";
case 2 -> "数据库";
case 3 -> "框架";
default -> "编程";
};
List<Video> videos = videoService.getVideosByCategory(category);
System.out.println("\n===== " + category + " 分类视频 =====");
displayVideoList(videos);
}
// 播放视频
private void playVideo() {
if (currentUser == null) {
System.out.println("请先登录后再播放视频!");
return;
}
System.out.print("请输入视频ID:");
Long videoId = scanner.nextLong();
scanner.nextLine();
// 查找视频
Optional<Video> videoOpt = videoService.getVideoDetail(videoId);
if (videoOpt.isEmpty()) {
System.out.println("视频不存在");
return;
}
Video video = videoOpt.get();
// 检查播放权限
boolean canPlay;
if (video.getPrice() > 0) {
// 付费视频需要验证购买状态或VIP身份
canPlay = userService.canPlay(currentUser.getId(), videoId, true);
} else {
// 免费视频直接播放
canPlay = true;
}
if (canPlay) {
String result = videoService.playVideo(videoId);
if (result.equals("视频不存在") || result.equals("视频已下架")) {
System.out.println(result);
} else {
System.out.println("正在播放视频:" + video.getTitle());
System.out.println("视频地址:" + result);
System.out.println("播放成功!");
}
} else {
System.out.println("该视频为付费视频,请购买或升级VIP后观看");
}
}
// 用户登录
private void login() {
System.out.print("请输入用户名:");
String username = scanner.nextLine();
System.out.print("请输入密码:");
String password = scanner.nextLine();
try {
currentUser = userService.login(username, password);
System.out.println("登录成功!欢迎 " + currentUser.getNickname());
} catch (RuntimeException e) {
System.out.println("登录失败:" + e.getMessage());
}
}
// 用户注册
private void register() {
System.out.print("请输入用户名:");
String username = scanner.nextLine();
System.out.print("请输入密码:");
String password = scanner.nextLine();
System.out.print("请输入昵称:");
String nickname = scanner.nextLine();
System.out.print("请输入邮箱:");
String email = scanner.nextLine();
System.out.print("请输入手机号:");
String phone = scanner.nextLine();
try {
currentUser = userService.register(username, password, nickname, email, phone);
System.out.println("注册成功!请重新登录");
currentUser = null;
} catch (RuntimeException e) {
System.out.println("注册失败:" + e.getMessage());
}
}
// 购买视频
private void purchaseVideo() {
if (currentUser == null) {
System.out.println("请先登录后再购买视频!");
return;
}
System.out.print("请输入要购买的视频ID:");
Long videoId = scanner.nextLong();
scanner.nextLine();
if (userService.purchaseVideo(currentUser.getId(), videoId)) {
System.out.println("购买成功!可以开始观看视频了。");
} else {
System.out.println("购买失败,可能您已经购买过该视频");
}
}
// 显示播放历史
private void showPlayHistory() {
if (currentUser == null) {
System.out.println("请先登录!");
return;
}
System.out.println("正在查询播放历史...");
// 此处简化处理,实际应根据用户ID查询播放记录
System.out.println("暂无播放历史记录");
}
// 显示视频列表
private void displayVideoList(List<Video> videos) {
if (videos.isEmpty()) {
System.out.println("暂无视频");
return;
}
System.out.println("+------+--------------------+----------+----------+--------+");
System.out.println("| ID | 标题 | 分类 | 播放次数 | 价格 |");
System.out.println("+------+--------------------+----------+----------+--------+");
for (Video video : videos) {
System.out.printf("| %-4d | %-18s | %-8s | %-8d | %.1f |%n",
video.getId(),
video.getTitle(),
video.getCategory(),
video.getPlayCount(),
video.getPrice()
);
}
System.out.println("+------+--------------------+----------+----------+--------+");
}
// 主方法
public static void main(String[] args) {
VodController controller = new VodController();
controller.showMainMenu();
}
}
附加功能类
// PlayRecordDAO.java
package com.vod.dao;
import com.vod.entity.PlayRecord;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
public class PlayRecordDAO {
private static List<PlayRecord> records = new ArrayList<>();
private static Long idCounter = 1L;
// 保存播放记录
public PlayRecord save(PlayRecord record) {
record.setId(idCounter++);
records.add(record);
return record;
}
// 根据用户ID查询播放记录
public List<PlayRecord> findByUserId(Long userId) {
return records.stream()
.filter(r -> r.getUserId().equals(userId))
.collect(Collectors.toList());
}
// 更新播放记录
public void update(PlayRecord record) {
records.removeIf(r -> r.getId().equals(record.getId()));
records.add(record);
}
// 查找用户的特定视频播放记录
public Optional<PlayRecord> findRecord(Long userId, Long videoId) {
return records.stream()
.filter(r -> r.getUserId().equals(userId) && r.getVideoId().equals(videoId))
.findFirst();
}
}
// 播放历史历史记录Service
package com.vod.service;
import com.vod.dao.PlayRecordDAO;
import com.vod.entity.PlayRecord;
import java.util.List;
import java.util.Optional;
public class PlayRecordService {
private PlayRecordDAO recordDAO;
public PlayRecordService() {
this.recordDAO = new PlayRecordDAO();
}
// 记录播放历史
public void recordPlay(Long userId, Long videoId, int progress) {
Optional<PlayRecord> existing = recordDAO.findRecord(userId, videoId);
if (existing.isPresent()) {
// 更新已有记录
PlayRecord record = existing.get();
record.setProgress(progress);
record.setPlayCount(record.getPlayCount() + 1);
recordDAO.update(record);
} else {
// 创建新记录
PlayRecord record = new PlayRecord(userId, videoId);
record.setProgress(progress);
recordDAO.save(record);
}
}
// 获取用户的播放历史
public List<PlayRecord> getUserHistory(Long userId) {
return recordDAO.findByUserId(userId);
}
// 获取播放进度
public int getProgress(Long userId, Long videoId) {
Optional<PlayRecord> record = recordDAO.findRecord(userId, videoId);
return record.map(PlayRecord::getProgress).orElse(0);
}
}
运行测试
创建测试主类:
// Main.java
package com.vod;
import com.vod.controller.VodController;
public class Main {
public static void main(String[] args) {
System.out.println("欢迎使用Java点播系统!");
VodController controller = new VodController();
controller.showMainMenu();
}
}
系统演示示例
运行系统后的交互示例:
========== 点播系统 ==========
1. 视频浏览
2. 视频搜索
3. 视频分类
4. 播放视频
5. 用户登录
6. 用户注册
7. 购买视频
8. 我的历史记录
9. 退出系统
请选择操作:1
===== 所有视频 =====
+------+--------------------+----------+----------+--------+
| ID | 标题 | 分类 | 播放次数 | 价格 |
+------+--------------------+----------+----------+--------+
| 1 | Java基础教程 | 编程 | 0 | 99.9 |
| 2 | MySQL数据库实战 | 数据库 | 0 | 129.9 |
| 3 | Spring Boot入门 | 框架 | 0 | 199.9 |
+------+--------------------+----------+----------+--------+
系统特性
核心功能
- 用户管理:注册、登录、VIP升级
- 视频管理:上传、分类、搜索、上下架
- 播放权限:免费视频直接播放,付费视频需购买或VIP
- 播放记录:记录播放进度和历史
扩展建议
- 添加数据库支持(MySQL)
- 实现视频评论功能
- 添加推荐算法
- 支持弹幕功能
- 接入第三方支付
- 添加CDN加速
这个案例提供了一个完整的点播系统基础架构,可以根据实际需求进行扩展和优化。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播