不知如何将Java+Vue知识应用到实战?短视频推荐系统项目让理论与实践无缝衔接|计算机毕业设计|python

48 阅读5分钟

一、个人简介

💖💖作者:计算机编程果茶熊 💙💙个人简介:曾长期从事计算机专业培训教学,担任过编程老师,同时本人也热爱上课教学,擅长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知识应用到实战?短视频推荐系统项目让理论与实践无缝衔接

四、短视频推荐系统-功能介绍

登录.png

后台热门视频管理.png

后台视频自动爬取.png

可视化.png

论坛模块.png

热门视频推荐.png

视频详情.png

五、短视频推荐系统-代码展示

// 功能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());

六、短视频推荐系统-文档展示

lunwen.png

七、END

谢谢.png

💕💕文末获取源码联系计算机编程果茶熊