基于微信小程序的旅游平台的设计与实现(源码+LW+报告+运行调试)

  💯博主:✌全网拥有30W+粉丝、博客专家、全栈领域优质创作者、平台优质Java创作者、专注于Java技术领域和毕业项目实战✌💯
💗开发技术:SpringBoot、Vue、SSM、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、机器学习等设计与开发。💗
👇🏻 推荐订阅👇🏻

Java精品实战案例《600套》
🌟文末获取源码+数据库🌟
感兴趣的可以先收藏起来,大家在毕设选题,项目以及报告编写等相关问题都可以给我咨询,希望帮助更多的人(免费选题指导)

系统需求分析:

   系统一般采用:前端+后端+mysql数据库的模式进行代码分层开发,方便代码的维护和功能的扩展,设计系统前需要设计数据库表,然后搭建前后端框架进行开发。

系统实现截图:

 程序代码参考:

package com.utils;



import java.util.*;
import java.util.stream.Collectors;

public class UserBasedCollaborativeFiltering {
	
    private Map<String, Map<String, Double>> userRatings;
    private Map<String, List<String>> itemUsers;
    private Map<String, Integer> userIndex;
    private Map<Integer, String> indexUser;
    private Long[][] sparseMatrix;

    public UserBasedCollaborativeFiltering(Map<String, Map<String, Double>> userRatings) {
        this.userRatings = userRatings;
        this.itemUsers = new HashMap<>();
        
        this.userIndex = new HashMap<>();//辅助存储每一个用户的用户索引index映射:user->index
        this.indexUser = new HashMap<>();//辅助存储每一个索引index对应的用户映射:index->user

        // 构建物品-用户倒排表
        int keyIndex = 0;
        for (String user : userRatings.keySet()) {
            Map<String, Double> ratings = userRatings.get(user);
            for (String item : ratings.keySet()) {
                if (!itemUsers.containsKey(item)) {
                    itemUsers.put(item, new ArrayList<>());
                }
                itemUsers.get(item).add(user);
            }
          //用户ID与稀疏矩阵建立对应关系
            this.userIndex.put(user,keyIndex);
            this.indexUser.put(keyIndex,user);
            keyIndex++;
        }
        
        int N = userRatings.size();
        this.sparseMatrix=new Long[N][N];//建立用户稀疏矩阵,用于用户相似度计算【相似度矩阵】
        for(int i=0;i<N;i++){
            for(int j=0;j<N;j++)
            	this.sparseMatrix[i][j]=(long)0;
        }
        for(String item : itemUsers.keySet()) {
        	List<String> userList = itemUsers.get(item);
        	for(String u1 : userList) {
        		for(String u2 : userList) {
        			if(u1.equals(u2)){
                        continue;
                    }
        			this.sparseMatrix[this.userIndex.get(u1)][this.userIndex.get(u2)]+=1;
        		}
        	}
        }
        
    }

    public double calculateSimilarity(String user1, String user2) {
        //计算用户之间的相似度【余弦相似性】
        Integer id1 = this.userIndex.get(user1);
        Integer id2 = this.userIndex.get(user2);
        if(id1==null || id2==null) return 0.0;
        return this.sparseMatrix[id1][id2]/Math.sqrt(userRatings.get(indexUser.get(id1)).size()*userRatings.get(indexUser.get(id2)).size());
    }

    public List<String> recommendItems(String targetUser, int numRecommendations) {
        // 计算目标用户与其他用户的相似度
        Map<String, Double> userSimilarities = new HashMap<>();
        for (String user : userRatings.keySet()) {
            if (!user.equals(targetUser)) {
                double similarity = calculateSimilarity(targetUser, user);
                userSimilarities.put(user, similarity);
            }
        }

        // 根据相似度进行排序
        List<Map.Entry<String, Double>> sortedSimilarities = new ArrayList<>(userSimilarities.entrySet());
        sortedSimilarities.sort(Map.Entry.comparingByValue(Comparator.reverseOrder()));

        // 选择相似度最高的K个用户
        List<String> similarUsers = new ArrayList<>();
        for (int i = 0; i < numRecommendations; i++) {
            if (i < sortedSimilarities.size()) {
                similarUsers.add(sortedSimilarities.get(i).getKey());
            } else {
                break;
            }
        }

        // 获取相似用户喜欢的物品,并进行推荐
        Map<String, Double> recommendations = new HashMap<>();
        for (String user : similarUsers) {
            Map<String, Double> ratings = userRatings.get(user);
            for (String item : ratings.keySet()) {
                if (userRatings.get(targetUser)!=null && !userRatings.get(targetUser).containsKey(item)) {
                    recommendations.put(item, ratings.get(item));
                }
            }
        }

        // 排序推荐物品
        LinkedHashMap<String, Double> sortedRecommendations = new LinkedHashMap<>(recommendations);
        // 取前N个推荐物品
        int numItems = Math.min(numRecommendations, sortedRecommendations.size());
        sortedRecommendations = sortedRecommendations.entrySet()
        .stream()
        .sorted((Map.Entry.<String, Double>comparingByValue().reversed())).limit(numItems)
        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new));
        List<String> result = new ArrayList<String>();
        result.addAll(sortedRecommendations.keySet());
        return result;
    }
    
    
}


SQL设计参考:

/*
 Navicat Premium Data Transfer

 Source Server         : 本地mysql8
 Source Server Type    : MySQL
 Source Server Version : 80029
 Source Host           : localhost:3306
 Source Schema         : chongwudianxinxixitong

 Target Server Type    : MySQL
 Target Server Version : 80029
 File Encoding         : 65001

*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for yonghu
-- ----------------------------
DROP TABLE IF EXISTS `yonghu`;
CREATE TABLE `yonghu` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT '主键',
  `username` varchar(200) DEFAULT NULL COMMENT '账户',
  `password` varchar(200) DEFAULT NULL COMMENT '密码',
  `yonghu_name` varchar(200) DEFAULT NULL COMMENT '用户姓名 Search111 ',
  `yonghu_phone` varchar(200) DEFAULT NULL COMMENT '用户手机号',
  `yonghu_id_number` varchar(200) DEFAULT NULL COMMENT '用户身份证号',
  `yonghu_photo` varchar(200) DEFAULT NULL COMMENT '用户头像',
  `sex_types` int DEFAULT NULL COMMENT '性别',
  `yonghu_email` varchar(200) DEFAULT NULL COMMENT '电子邮箱',
  `new_money` decimal(10,2) DEFAULT NULL COMMENT '余额 ',
  `yonghu_sum_jifen` decimal(10,2) DEFAULT NULL COMMENT '总积分',
  `yonghu_new_jifen` decimal(10,2) DEFAULT NULL COMMENT '现积分',
  `huiyuandengji_types` int DEFAULT NULL COMMENT '会员等级',
  `create_time` timestamp NULL DEFAULT NULL COMMENT '创建时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb3 COMMENT='用户';

-- ----------------------------
-- Records of yonghu
-- ----------------------------
BEGIN;
INSERT INTO `yonghu` VALUES (1, 'a1', '1', '用户姓名1', '17703786901', '410224199610232001', 'http://localhost:8080/chongwudianxinxixitong/upload/yonghu1.jpg', 2, '1@qq.com', 9721.86, 2697.35, 2477.74, 1, '2024-02-22 16:41:17');
INSERT INTO `yonghu` VALUES (2, 'a2', '123456', '用户姓名2', '17703786902', '410224199610232002', 'http://localhost:8080/chongwudianxinxixitong/upload/yonghu2.jpg', 2, '2@qq.com', 908.55, 980.07, 474.04, 1, '2024-02-22 16:41:17');
INSERT INTO `yonghu` VALUES (3, 'a3', '123456', '用户姓名3', '17703786903', '410224199610232003', 'http://localhost:8080/chongwudianxinxixitong/upload/yonghu3.jpg', 2, '3@qq.com', 152.33, 993.05, 441.46, 1, '2024-02-22 16:41:17');
INSERT INTO `yonghu` VALUES (4, '3', '3', '3', '17383729213', NULL, NULL, 2, '333@qq.com', 0.00, 0.00, 0.00, 1, '2024-04-28 16:19:34');
COMMIT;

SET FOREIGN_KEY_CHECKS = 1;

系统技术介绍:

Springboot框架介绍:

     通过约定优于配置,减少了复杂的 XML 配置,提供了自动配置功能,让开发者可以快速上手。内置的启动器(Starter)和自动配置功能使得新项目的搭建变得非常简单,开发者可以专注于业务逻辑。Spring Boot 支持内嵌的 Tomcat、Jetty 或 Undertow,无需外部应用服务器,方便部署和开发。与 Spring Cloud 无缝集成,提供了构建微服务架构的便利,支持服务注册、配置管理等功能。活跃的社区和丰富的文档,使得开发者在遇到问题时能够快速找到解决方案。可与 Spring 框架的其他模块无缝集成,支持多种数据源和技术栈,满足不同项目需求。内置的 Actuator 模块提供了应用监控、健康检查和指标统计功能,方便运维管理。可以轻松集成 Spring Security,为应用提供安全保护。 这些优势使得 Spring Boot 成为构建现代 Java 应用的热门选择。

黑白盒系统测试:

   黑盒测试和白盒测试是软件测试中两种主要的方法,各有不同的侧重点和应用场景。黑盒测试是一种测试方法,关注软件的功能和输出,而不考虑其内部实现。测试人员根据需求文档和用户界面设计来编写测试用例,测试系统的功能是否按预期工作。黑盒测试的主要特点包括:测试输入和输出,不涉及内部代码结构。模拟最终用户的使用场景,验证系统的行为是否符合需求。有效发现功能缺陷、界面问题和用户体验不足等。包括功能测试、界面测试、兼容性测试等。白盒测试是一种测试方法,测试人员需要了解软件的内部结构和实现逻辑,通常由开发人员进行。测试通过检查代码的逻辑路径、分支和循环等来确保软件的功能和性能。白盒测试的主要特点包括:测试的焦点在于代码的内部结构和实现,确保每个逻辑路径都得到验证。通常由开发人员进行,能够检查代码质量和潜在缺陷。有效发现逻辑错误、边界条件问题和性能瓶颈等。包括单元测试、集成测试和代码覆盖率测试等。黑盒测试和白盒测试在软件开发生命周期中相辅相成,前者关注用户需求和功能实现,后者则专注于代码质量和逻辑正确性。结合这两种测试方法,可以全面提高软件的质量和稳定性。

开发案例:

选择我的理由:

     博主从事java开发多年,拥有丰富的java软件开发经验:可以一对一指导并实现需求,避免中介参与,有java技术疑问的博主都可以免费解答。

源码获取: 

大家点赞、收藏、关注、评论啦 、查看👇🏻获取联系方式👇🏻

Java精品实战项目案例《600套》

精彩专栏推荐订阅:在下方专栏👇🏻

下方名片联系我即可~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值