视频点播系统扩展示例
- 更多的前端页面(如视频详情页、用户注册页等)。
- 更复杂的业务逻辑(如视频评论、搜索功能等)。
- 安全性和权限管理(如用户角色管理、权限控制等)。
- 其他技术细节(如文件上传、分页查询等)。
1. 视频详情页
创建一个视频详情页面,显示视频的详细信息和评论。
videoView.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>Video Details</title>
</head>
<body>
<h1>Video Details</h1>
<div>
<h2 th:text="${video.title}"></h2>
<p th:text="${video.description}"></p>
<video width="320" height="240" controls>
<source th:src="@{${video.file_path}}" type="video/mp4">
Your browser does not support the video tag.
</video>
<p>Category: <span th:text="${video.category.name}"></span></p>
<p>Uploaded by: <span th:text="${video.uploadUser.username}"></span></p>
<p>Upload Time: <span th:text="${video.upload_time}"></span></p>
</div>
<h2>Comments</h2>
<ul>
<li th:each="comment : ${video.comments}">
<p th:text="${comment.content}"></p>
<p>By: <span th:text="${comment.user.username}"></span></p>
<p>At: <span th:text="${comment.created_at}"></span></p>
</li>
</ul>
<form th:action="@{/video/comment/{id}(id=${video.id})}" method="post">
<label>Comment:</label><textarea name="content"></textarea><br/>
<button type="submit">Submit Comment</button>
</form>
</body>
</html>
2. 视频评论功能
在VideoController
中添加处理评论的逻辑。
VideoController.java
package com.video.controller;
import com.video.entity.Comment;
import com.video.entity.Video;
import com.video.service.CommentService;
import com.video.service.VideoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@Controller
@RequestMapping("/video")
public class VideoController {
@Autowired
private VideoService videoService;
@Autowired
private CommentService commentService;
@GetMapping("/list")
public String listVideos(Model model) {
List<Video> videos = videoService.getAllVideos();
model.addAttribute("videos", videos);
return "videoList";
}
@GetMapping("/view/{id}")
public String viewVideo(@PathVariable("id") int id, Model model) {
Video video = videoService.getVideoById(id);
video.setComments(commentService.getCommentsByVideoId(id));
model.addAttribute("video", video);
return "videoView";
}
@PostMapping("/comment/{id}")
public String addComment(@PathVariable("id") int id, @RequestParam("content") String content, Model model) {
// 假设已经通过 session 获取到当前用户
User currentUser = (User) model.getAttribute("currentUser");
Comment comment = new Comment();
comment.setContent(content);
comment.setUser(currentUser);
comment.setVideo(videoService.getVideoById(id));
commentService.addComment(comment);
return "redirect:/video/view/" + id;
}
// 其他方法...
}
3. 用户注册页
创建一个用户注册页面。
register.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>Register Page</title>
</head>
<body>
<h1>Register</h1>
<form th:action="@{/user/register}" method="post">
<label>Username:</label><input type="text" name="username"/><br/>
<label>Password:</label><input type="password" name="password"/><br/>
<label>Email:</label><input type="email" name="email"/><br/>
<label>Phone:</label><input type="text" name="phone"/><br/>
<button type="submit">Register</button>
</form>
</body>
</html>
4. 文件上传功能
在VideoController
中添加文件上传的逻辑。
VideoController.java
package com.video.controller;
import com.video.entity.Video;
import com.video.service.VideoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.UUID;
@Controller
@RequestMapping("/video")
public class VideoController {
@Autowired
private VideoService videoService;
private final Path rootLocation = Paths.get("uploads");
@PostMapping("/add")
public String addVideo(@ModelAttribute Video video, @RequestParam("file") MultipartFile file) {
try {
// 保存文件到指定路径
String uniqueFileName = UUID.randomUUID().toString() + "_" + file.getOriginalFilename();
File dest = new File(rootLocation.toString(), uniqueFileName);
Files.copy(file.getInputStream(), dest.toPath());
// 设置文件路径
video.setFile_path(uniqueFileName);
videoService.addVideo(video);
} catch (IOException e) {
e.printStackTrace();
}
return "redirect:/video/list";
}
// 其他方法...
}
5. 分页查询
在VideoService
中添加分页查询的功能。
VideoService.java
package com.video.service;
import com.video.entity.Video;
import com.video.mapper.VideoMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class VideoService {
@Autowired
private VideoMapper videoMapper;
public List<Video> getAllVideos() {
return videoMapper.findAll();
}
public List<Video> getVideosByPage(int page, int size) {
int offset = (page - 1) * size;
return videoMapper.findVideosByPage(offset, size);
}
// 其他方法...
}
VideoMapper.java
package com.video.mapper;
import com.video.entity.Video;
import org.apache.ibatis.annotations.*;
import java.util.List;
@Mapper
public interface VideoMapper {
@Select("SELECT * FROM video")
List<Video> findAll();
@Select("SELECT * FROM video LIMIT #{offset}, #{size}")
List<Video> findVideosByPage(@Param("offset") int offset, @Param("size") int size);
// 其他方法...
}
6. 视频列表页的分页功能
在videoList.html
中添加分页功能。
videoList.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>Video List</title>
</head>
<body>
<h1>Video List</h1>
<table border="1">
<tr>
<th>ID</th>
<th>Title</th>
<th>Description</th>
<th>File Path</th>
<th>Category</th>
<th>Upload User</th>
<th>Upload Time</th>
<th>Actions</th>
</tr>
<tr th:each="video : ${videos}">
<td th:text="${video.id}"></td>
<td th:text="${video.title}"></td>
<td th:text="${video.description}"></td>
<td th:text="${video.file_path}"></td>
<td th:text="${video.category_id}"></td>
<td th:text="${video.upload_user_id}"></td>
<td th:text="${video.upload_time}"></td>
<td>
<a th:href="@{/video/view/{id}(id=${video.id})}">View</a>
<a th:href="@{/video/edit/{id}(id=${video.id})}">Edit</a>
<a th:href="@{/video/delete/{id}(id=${video.id})}">Delete</a>
</td>
</tr>
</table>
<div>
<a th:if="${currentPage > 1}" th:href="@{/video/list(page=${currentPage - 1})}">Previous</a>
<a th:if="${currentPage < totalPages}" th:href="@{/video/list(page=${currentPage + 1})}">Next</a>
</div>
<a href="/video/add">Add New Video</a>
</body>
</html>
7. 视频列表控制器的分页支持
在VideoController
中添加分页支持。
VideoController.java
package com.video.controller;
import com.video.entity.Video;
import com.video.service.VideoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@Controller
@RequestMapping("/video")
public class VideoController {
@Autowired
private VideoService videoService;
@GetMapping("/list")
public String listVideos(@RequestParam(defaultValue = "1") int page, Model model) {
int pageSize = 10; // 每页显示的记录数
List<Video> videos = videoService.getVideosByPage(page, pageSize);
int totalVideos = videoService.getAllVideos().size();
int totalPages = (int) Math.ceil((double) totalVideos / pageSize);
model.addAttribute("videos", videos);
model.addAttribute("currentPage", page);
model.addAttribute("totalPages", totalPages);
return "videoList";
}
// 其他方法...
}
以上是一些扩展功能的示例。如果有其他具体需求或问题,请提供详细信息,以便进一步帮助。