一、个人简介
💖💖作者:计算机编程果茶熊 💙💙个人简介:曾长期从事计算机专业培训教学,担任过编程老师,同时本人也热爱上课教学,擅长Java、微信小程序、Python、Golang、安卓Android等多个IT方向。会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。平常喜欢分享一些自己开发中遇到的问题的解决办法,也喜欢交流技术,大家有技术代码这一块的问题可以问我! 💛💛想说的话:感谢大家的关注与支持! 💕💕文末获取源码联系计算机编程果茶熊
二、前言
开发语言:Java+Python 数据库:MySQL 系统架构:B/S 后端框架:SpringBoot(Spring+SpringMVC+Mybatis)+Django 前端:Vue+HTML+CSS+JavaScript+jQuery
本短视频推荐系统是一款基于B/S架构的综合性平台,采用Java/Python双语言支持,分别结合Spring Boot(Spring+SpringMVC+Mybatis)和Django框架实现后端逻辑,前端采用Vue+ElementUI+HTML技术栈打造流畅用户界面。系统以MySQL作为数据库支撑,构建了完整的用户生态圈。核心功能包括智能化的用户管理模块,可根据用户行为特征进行分类管理;热门视频推荐功能,通过算法分析用户偏好,精准推送符合兴趣的内容;用户反馈系统,收集并分析用户体验数据;论坛交流平台,促进用户间互动与内容分享;系统管理功能,确保平台稳定运行;用户信息管理,保障用户数据安全与隐私;数据可视化模块,直观展现平台运营数据与用户行为分析。整体设计注重用户体验与系统性能,为用户提供个性化、高效的短视频浏览与交流环境,同时为管理者提供全面的数据支持与系统维护工具。
三、短视频推荐系统-视频解说
不知如何将Java+Vue知识应用到实战?短视频推荐系统项目让理论与实践无缝衔接
四、短视频推荐系统-功能介绍
五、短视频推荐系统-代码展示
// 功能1: 个性化短视频推荐算法核心实现 public List recommendVideosForUser(Long userId) { // 获取用户历史行为数据 List userBehaviors = userBehaviorRepository.findByUserId(userId); Map<String, Double> userInterests = new HashMap<>();
// 计算用户兴趣权重
for (UserBehavior behavior : userBehaviors) {
String category = behavior.getVideoCategory();
Double weight = userInterests.getOrDefault(category, 0.0);
// 根据行为类型赋予不同权重
switch (behavior.getBehaviorType()) {
case LIKE: weight += 5.0; break;
case WATCH_COMPLETE: weight += 3.0; break;
case COMMENT: weight += 4.0; break;
case SHARE: weight += 6.0; break;
case CLICK: weight += 1.0; break;
default: weight += 0.5;
}
userInterests.put(category, weight);
}
// 获取用户最感兴趣的前3个类别
List<String> topCategories = userInterests.entrySet().stream()
.sorted(Map.Entry.<String, Double>comparingByValue().reversed())
.limit(3)
.map(Map.Entry::getKey)
.collect(Collectors.toList());
// 按兴趣类别查找热门视频
List<VideoDTO> recommendedVideos = new ArrayList<>();
for (String category : topCategories) {
List<Video> categoryVideos = videoRepository.findTopByCategory(category, 10);
recommendedVideos.addAll(categoryVideos.stream()
.map(videoMapper::toDTO)
.collect(Collectors.toList()));
}
// 添加一些随机推荐,避免信息茧房
List<Video> randomVideos = videoRepository.findRandomVideos(5);
recommendedVideos.addAll(randomVideos.stream()
.map(videoMapper::toDTO)
.collect(Collectors.toList()));
// 根据用户最近观看时间过滤掉已看过的视频
Set<Long> recentWatchedIds = userBehaviors.stream()
.filter(b -> b.getCreatedTime().isAfter(LocalDateTime.now().minusDays(3)))
.map(UserBehavior::getVideoId)
.collect(Collectors.toSet());
recommendedVideos = recommendedVideos.stream()
.filter(v -> !recentWatchedIds.contains(v.getId()))
.collect(Collectors.toList());
return recommendedVideos;
}
// 功能2: 用户数据可视化分析处理 public UserAnalyticsDTO generateUserAnalytics(Long userId, AnalyticsTimeRange timeRange) { LocalDateTime startTime; LocalDateTime endTime = LocalDateTime.now();
// 确定分析的时间范围
switch (timeRange) {
case WEEK: startTime = endTime.minusWeeks(1); break;
case MONTH: startTime = endTime.minusMonths(1); break;
case QUARTER: startTime = endTime.minusMonths(3); break;
case YEAR: startTime = endTime.minusYears(1); break;
default: startTime = endTime.minusDays(7);
}
// 获取用户在指定时间范围内的行为数据
List<UserBehavior> behaviors = userBehaviorRepository.findByUserIdAndTimeBetween(userId, startTime, endTime);
// 计算各类别视频观看时长统计
Map<String, Long> categoryWatchTime = new HashMap<>();
for (UserBehavior behavior : behaviors) {
if (behavior.getBehaviorType() == BehaviorType.WATCH_COMPLETE || behavior.getBehaviorType() == BehaviorType.WATCH_PARTIAL) {
String category = behavior.getVideoCategory();
Long duration = behavior.getWatchDurationSeconds();
categoryWatchTime.put(category, categoryWatchTime.getOrDefault(category, 0L) + duration);
}
}
// 生成每日活跃度数据
Map<LocalDate, Integer> dailyActivityCount = new HashMap<>();
for (UserBehavior behavior : behaviors) {
LocalDate date = behavior.getCreatedTime().toLocalDate();
dailyActivityCount.put(date, dailyActivityCount.getOrDefault(date, 0) + 1);
}
// 计算互动率 (互动次数/观看次数)
long totalWatchCount = behaviors.stream()
.filter(b -> b.getBehaviorType() == BehaviorType.WATCH_COMPLETE || b.getBehaviorType() == BehaviorType.WATCH_PARTIAL)
.count();
long totalInteractionCount = behaviors.stream()
.filter(b -> b.getBehaviorType() == BehaviorType.LIKE || b.getBehaviorType() == BehaviorType.COMMENT || b.getBehaviorType() == BehaviorType.SHARE)
.count();
double interactionRate = totalWatchCount > 0 ? (double) totalInteractionCount / totalWatchCount : 0;
// 生成用户兴趣标签
List<String> interestTags = categoryWatchTime.entrySet().stream()
.sorted(Map.Entry.<String, Long>comparingByValue().reversed())
.limit(5)
.map(Map.Entry::getKey)
.collect(Collectors.toList());
// 构建并返回分析结果
UserAnalyticsDTO analytics = new UserAnalyticsDTO();
analytics.setUserId(userId);
analytics.setCategoryWatchTime(categoryWatchTime);
analytics.setDailyActivityCount(dailyActivityCount);
analytics.setInteractionRate(interactionRate);
analytics.setInterestTags(interestTags);
analytics.setTotalWatchTimeSeconds(categoryWatchTime.values().stream().mapToLong(Long::longValue).sum());
analytics.setTotalVideosWatched(totalWatchCount);
return analytics;
}
// 功能3: 论坛交流帖子智能排序与推荐 public Page getRecommendedForumPosts(Long userId, Pageable pageable) { // 获取用户信息和兴趣偏好 User user = userRepository.findById(userId) .orElseThrow(() -> new UserNotFoundException("用户不存在: " + userId));
// 获取用户关注的话题标签
List<String> userFollowedTags = userTagRepository.findTagsByUserId(userId);
// 获取用户最近互动过的帖子ID列表
List<Long> recentInteractedPostIds = forumInteractionRepository
.findByUserIdAndCreatedTimeAfter(userId, LocalDateTime.now().minusDays(14))
.stream()
.map(ForumInteraction::getPostId)
.collect(Collectors.toList());
// 找出与用户互动帖子相关联的标签
List<String> interactionRelatedTags = new ArrayList<>();
if (!recentInteractedPostIds.isEmpty()) {
interactionRelatedTags = forumPostTagRepository.findTagsByPostIds(recentInteractedPostIds);
}
// 合并用户关注标签和互动相关标签,去重
Set<String> relevantTags = new HashSet<>();
relevantTags.addAll(userFollowedTags);
relevantTags.addAll(interactionRelatedTags);
// 如果用户标签很少,添加一些热门标签以丰富推荐
if (relevantTags.size() < 3) {
List<String> popularTags = forumPostTagRepository.findPopularTags(5);
relevantTags.addAll(popularTags);
}
// 基于相关标签获取帖子,并计算相关度得分
List<ForumPost> allCandidatePosts = forumPostRepository
.findByTagsInAndCreatedTimeAfterOrderByCreatedTimeDesc(
relevantTags, LocalDateTime.now().minusDays(30), PageRequest.of(0, 100));
// 为每个帖子计算综合得分
List<ScoredPost> scoredPosts = new ArrayList<>();
for (ForumPost post : allCandidatePosts) {
double score = 0.0;
// 基于标签匹配计算相关度得分
Set<String> postTags = new HashSet<>(forumPostTagRepository.findTagsByPostId(post.getId()));
int matchingTags = 0;
for (String tag : postTags) {
if (relevantTags.contains(tag)) {
matchingTags++;
// 如果是用户关注的标签,给予更高权重
if (userFollowedTags.contains(tag)) {
score += 3.0;
} else {
score += 1.0;
}
}
}
// 根据帖子热度增加得分
score += post.getLikeCount() * 0.1;
score += post.getCommentCount() * 0.2;
score += post.getViewCount() * 0.05;
// 时间衰减因子,越新的帖子得分越高
long daysOld = ChronoUnit.DAYS.between(post.getCreatedTime(), LocalDateTime.now());
double timeDecay = Math.exp(-0.05 * daysOld);
score *= timeDecay;
// 如果是用户关注的作者发布的,提升得分
if (userFollowRepository.existsByFollowerIdAndFollowingId(userId, post.getAuthorId())) {
score *= 1.5;
}
scoredPosts.add(new ScoredPost(post, score));
}
// 按得分降序排序
scoredPosts.sort((a, b) -> Double.compare(b.getScore(), a.getScore()));
// 分页处理
int start = (int) pageable.getOffset();
int end = Math.min((start + pageable.getPageSize()), scoredPosts.size());
List<ForumPost> pageContent = start < scoredPosts.size() ?
scoredPosts.subList(start, end).stream().map(ScoredPost::getPost).collect(Collectors.toList()) :
Collections.emptyList();
// 转换为DTO并返回
List<ForumPostDTO> postDTOs = pageContent.stream()
.map(forumPostMapper::toDTO)
.collect(Collectors.toList());
return new PageImpl<>(postDTOs, pageable, scoredPosts.size());
六、短视频推荐系统-文档展示
七、END
💕💕文末获取源码联系计算机编程果茶熊