Springboot的简单推荐实现
- 使用 Spring Boot 构建社团招新推荐系统,用户注册后选择兴趣,系统根据兴趣推荐社团。
- 实现包括用户注册、兴趣选择和基于标签匹配的推荐算法。
- 系统使用 JPA 管理数据库,Spring Security 确保安全,推荐前5个匹配度最高的社团。
- 用户注册:用户提供用户名、密码和兴趣列表,系统存储用户信息。
- 社团数据:预先定义社团及其标签,方便后续匹配。
- 推荐服务:计算用户兴趣与社团标签的重叠数量,排序后返回前5个推荐。
- 用户管理:用户注册并选择兴趣,系统存储用户信息。
- 社团管理:预先定义社团及其标签,方便后续匹配。
- 推荐服务:基于用户兴趣和社团标签进行匹配,生成推荐列表。
| 实体 | 属性 | 描述 |
|---|---|---|
| User 用户 | id, username, password, interests | 用户ID、用户名、密码(加密)、兴趣列表 |
| Club 俱乐部 | id, name, description, tags | 社团ID、名称、描述、标签列表 |
- User 实体:使用 @Entity 注解定义,interests 使用 @ElementCollection 存储为字符串列表。
- Club 实体:同样使用 @Entity 注解,tags 存储社团的兴趣标签。
@Entity
public class User {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String username;private String password;@ElementCollectionprivate List<String> interests;// getters and setters
}@Entity
public class Club {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String name;private String description;@ElementCollectionprivate List<String> tags;// getters and setters
} - 获取用户的所有兴趣(user.getInterests())。
- 获取系统中所有社团(clubRepository.findAll())。
- 对每个社团,计算用户兴趣与社团标签的匹配数量:
- 遍历用户兴趣列表,检查是否在社团标签中出现,出现一次加1分。
-
- 将匹配分数存储在 Map<Club, Integer> 中,仅保留分数大于0的社团。
- 按匹配分数降序排序,返回前5个社团。
@Service
public class RecommendationService {@Autowiredprivate ClubRepository clubRepository;public List<Club> recommendClubs(User user) {List<String> userInterests = user.getInterests();List<Club> allClubs = clubRepository.findAll();Map<Club, Integer> clubMatchScore = new HashMap<>();for (Club club : allClubs) {int matchScore = 0;for (String interest : userInterests) {if (club.getTags().contains(interest)) {
matchScore++;}}if (matchScore > 0) {
clubMatchScore.put(club, matchScore);}}return clubMatchScore.entrySet().stream().sorted(Map.Entry.comparingByValue(Comparator.reverseOrder())).limit(5).map(Map.Entry::getKey).collect(Collectors.toList());}
} @RestController
@RequestMapping("/api")
public class ClubController {@Autowiredprivate UserService userService;@Autowiredprivate RecommendationService recommendationService;@PostMapping("/register")public ResponseEntity<User> register(@RequestBody UserRegistrationDTO dto) {User user = new User();
user.setUsername(dto.getUsername());
user.setPassword(passwordEncoder.encode(dto.getPassword()));
user.setInterests(dto.getInterests());User savedUser = userService.save(user);return ResponseEntity.ok(savedUser);}@GetMapping("/recommendations")public ResponseEntity<List<Club>> getRecommendations(@AuthenticationPrincipal User user) {List<Club> recommendedClubs = recommendationService.recommendClubs(user);return ResponseEntity.ok(recommendedClubs);}
} | 依赖 | 用途 |
|---|---|
| spring-boot-starter-web | 提供 REST API 支持 |
| spring-boot-starter-data-jpa | JPA 数据库操作 |
| spring-boot-starter-security | 用户认证与安全 |
| h2 | 内存数据库(开发测试用) |
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency><dependency><groupId>com.h2database</groupId><artifactId>h2</artifactId><scope>runtime</scope></dependency>
</dependencies> // 注册
axios.post('/api/register', {username: 'user1',password: 'password123',interests: ['music', 'sports', 'tech']
}).then(response => {
console.log('Registered:', response.data);
});// 获取推荐
axios.get('/api/recommendations', {headers: {Authorization: 'Bearer ' + token
}
}).then(response => {
console.log('Recommended clubs:', response.data);
}); INSERT INTO club (name, description) VALUES ('音乐社', '热爱音乐的聚集地');
INSERT INTO club_tags (club_id, tags) VALUES (1, 'music');
INSERT INTO club_tags (club_id, tags) VALUES (1, 'art');INSERT INTO club (name, description) VALUES ('体育社', '运动爱好者之家');
INSERT INTO club_tags (club_id, tags) VALUES (2, 'sports'); 相关文章:
Springboot的简单推荐实现
以springboot 推荐社团招新为例子 使用 Spring Boot 构建社团招新推荐系统,用户注册后选择兴趣,系统根据兴趣推荐社团。 实现包括用户注册、兴趣选择和基于标签匹配的推荐算法。 系统使用 JPA 管理数据库,Spring Security 确保安全࿰…...
如何使用Python快速开发一个带管理系统界面的网站-解析方案
如果你想用 Python 开发一个 管理系统界面 的网站,并且希望界面美观,可以考虑以下几个框架和库: 1. Streamlit(快速、简洁) 适合:数据分析、仪表盘、内部管理系统特点: 写法简单,类…...
深入剖析抽象工厂模式:设计模式中的架构利器
深入剖析抽象工厂模式:设计模式中的架构利器 在软件开发领域,设计模式是解决常见问题的通用方案,而抽象工厂模式作为创建型设计模式的重要一员,在构建复杂软件系统时发挥着关键作用。它为创建一系列相关或相互依赖的对象提供了一…...
面试基础-如何设计一个短链接系统
设计一个每秒处理 100 万个请求(WQPS)的短链系统需要综合考虑性能、可用性和可扩展性。以下是设计方案: 1. 系统架构设计 采用微服务架构,将功能模块化,便于水平扩展和故障隔离。 核心组件: 短链生成服务…...
Win11 24h2 不能正常使用ensp的问题(已解决)
因为Win11 24h2的内核大小更改,目前virtualbox在7.1.4中更新解决了。所以Win11 24H2系统版本无法使用 5.x.xx的virtualbox版本,virtualbox对于这个5.x.xx版本早已停止维护,所以这个以后不会有调整。 对应的报错代码是 virtualbox错误代码&…...
蓝桥杯——按键
一:按键得原理图 二:按键的代码配置 step1 按键原理图对应引脚配置为输入状态 step2 在GPIO中将对应引脚设置为上拉模式 step3 在fun.c中写按键扫描函数 写完后的扫描函数需放在主函数中不断扫描 扫描函数主要通过两个定义变量的值来判断…...
Linux环境基础开发工具的使用(三)
五、Linux项目自动化构建工具-make/Makefile make:是一条指令。 makefile:是一个当前目录下的文件。 第一行:依赖关系。 第二行:依赖方法。 clean是空依赖关系。 编译文件清理 背景 会不会写makefile,从一个侧面说…...
vue中将el-table导出为excel文件
在 Vue Element UI 中,el-table 数据导出 Excel 文件,可以使用 xlsx(SheetJS)库进行处理。以下是详细的实现方法,包括安装依赖、代码示例和优化建议。 1. 安装依赖 首先,安装 xlsx 库: 复制…...
electron提升软件运行权限,以管理员权限运行
大家有任何想法,都可以联系博主沟通。 本系列为实战文章,最终实现的桌面工具软件,获取方式:百度网盘地址:https://pan.baidu.com/s/1yrl0jYpti7QCn8CHBRT2lw?pwd1234 正文开始 前言一、提升electron运行权限的三种方…...
力扣LeetCode: 2506 统计相似字符串对的数目
题目: 给你一个下标从 0 开始的字符串数组 words 。 如果两个字符串由相同的字符组成,则认为这两个字符串 相似 。 例如,"abca" 和 "cba" 相似,因为它们都由字符 a、b、c 组成。然而,"aba…...
安科瑞能源物联网平台助力企业实现绿色低碳转型
安科瑞顾强 随着全球能源结构的转型和“双碳”目标的推进,能源管理正朝着智能化、数字化的方向快速发展。安科瑞电气股份有限公司推出的微电网智慧能源管理平台(EMS 3.0),正是这一趋势下的创新解决方案。该平台集成了物联网&…...
Spring Boot 中使用 @Transactional 注解配置事务管理
事务管理是应用系统开发中必不可少的一部分。Spring 为事务管理提供了丰富的功能支持。Spring 事务管理分为编程式和声明式的两种方式。编程式事务指的是通过编码方式实现事务;声明式事务基于 AOP,将具体业务逻辑与事务处理解耦。声明式事务管理使业务代码逻辑不受污…...
动态链接器(九):.init和.init_array
ELF文件中的.init和.init_array段是程序初始化阶段的重要组成部分,用于在main函数执行前完成必要的初始化操作。 1 .init段和.init_array 段 1.1 作用 .init段包含编译器生成的初始化代码,通常由运行时环境(如C标准库的启动例程࿰…...
标准I/O与文件I/O
一、概念 标准IO:标准IO是指程序与标准输入(stdin)、标准输出(stdout)和标准错误(stderr)之间的输入输出操作。通常用于与用户交互或输出调试信息。文件IO:文件IO是指程序与文件系统…...
【JavaScript】《JavaScript高级程序设计 (第4版) 》笔记-Chapter20-JavaScript API
二十、JavaScript API JavaScript API 随着 Web 浏览器能力的增加,其复杂性也在迅速增加。从很多方面看,现代 Web 浏览器已经成为构建于诸多规范之上、集不同 API 于一身的“瑞士军刀”。浏览器规范的生态在某种程度上是混乱而无序的。一些规范如 HTML5&…...
C#初级教程(7)——初级期末检测
练习 1:计算圆的周长和面积 改编题目:编写一个 C# 程序,让用户输入圆的半径,然后计算并输出该圆的周长和面积,结果保留两位小数。 using System;class CircleCalculation {static void Main(){const double pi 3.14…...
RT-Thread+STM32L475VET6——TF 卡文件系统
文章目录 前言一、板载资源二、具体步骤1.打开CubeMX进行USB配置1.1 使用外部高速时钟,并修改时钟树1.2 打开SPI1,参数默认即可(SPI根据自己需求调整)1.3 打开串口,参数默认1.4 生成工程 2.配置SPI2.1 打开SPI驱动2.2 声明使用SPI…...
排序链表--字节跳动
少年的书桌上没有虚度的光阴 题目描述 请你对链表进行排序 思路分析 核心思想:归并排序 有三个部分 链表排序实现 1. merge 函数 21.见 合并两个有序链表, 首先创建一个虚拟头节点 newhead,并使用指针 tail 来构建合并后的链表。 通过…...
[论文解析]OmniRe: Omni Urban Scene Reconstruction
OmniRe: Omni Urban Scene Reconstruction 论文地址:https://arxiv.org/abs/2408.16760 代码地址:https://github.com/ziyc/drivestudio 项目地址:https://ziyc.github.io/omnire/ 论文解读 总结 这篇论文代表了一种重建的方向࿰…...
【微服务优化】ELK日志聚合与查询性能提升实战指南
网罗开发 (小红书、快手、视频号同名) 大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等…...
Docker实战-使用docker compose搭建博客
docker run 部署 创建blog网络 [rootk8s-master ~]# docker network create blog 8f533a5a1ec65eae3f98c0ae5a76014a3ab1bf3c087ad952cdc100cc7a658948 [rootk8s-master ~]# docker network ls NETWORK ID NAME DRIVER SCOPE 8f533a5a1ec6 blog bridge …...
python 虚拟机的使用方式
Python虚拟机(PVM)是Python语言的核心运行机制,它通过解释和执行字节码来运行Python代码。以下是关于Python虚拟机的详细使用方式: 1. Python虚拟机的基本概念 Python虚拟机(PVM)是一个抽象的计算机&…...
【JT/T 808协议】808 协议开发笔记 ② ( 终端注册 | 终端注册应答 | 字符编码转换网站 )
文章目录 一、消息头 数据1、消息头拼接2、消息 ID 字段3、消息体属性 字段4、终端手机号 字段5、终端流水号 字段 二、消息体 数据三、校验码计算四、最终计算结果五、终端注册应答1、分解终端应答数据2、终端应答 消息体 数据 六、字符编码转换网站 一、消息头 数据 1、消息头…...
番茄工作法html实现
对比了deepseek-r1-online和本地部署的14b的版本,输出的输出的html页面。 在线满血版的功能比较强大,可以一次完成所有要求。14b版本的功能有一些欠缺,但是基本功能也是写了出来了。 input write a html named Pomodoro-clock which “hel…...
抓包工具 wireshark
1.什么是抓包工具 抓包工具是什么?-CSDN博客 2.wireshark的安装 【抓包工具】win 10 / win 11:WireShark 下载、安装、使用_windows抓包工具-CSDN博客 3.wireshark的基础操作 Wireshark零基础使用教程(超详细) - 元宇宙-Meta…...
51单片机学习之旅——定时器
打开软件 1与其它等于其它,0与其它等于0 1或其它等于1,0或其它等于其它 TMODTMOD&0xF0;//0xF01111 0000进行与操作,高四位保持,低四位清零,高四位定时器1,低四位定时器0 TMODTMOD|0x01;//0x010000 0…...
hot100_139. 单词拆分
hot100_139. 单词拆分 思路 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。如果可以利用字典中出现的一个或多个单词拼接出 s 则返回 true。 注意:不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。 示例 1: 输入:…...
Linux firewalld 常用命令
本文参考RedHat官网文章How to configure a firewall on Linux with firewalld。 Firewalld 是守护进程名,对应命令为firewall-cmd。帮助详见以下命令: $ firewall-cmd --helpUsage: firewall-cmd [OPTIONS...]General Options-h, --help Pr…...
《网络安全入门实战手册》
0经验转行网络安全,个人分享一下学习中总结的文档,以下为目录可以点击标题看对应文章,欢迎评论区讨论,后期会发更多安全相关的学习资料等。希望跟大家一起进步。 第1章:网络安全基础知识 1、什么是网络安全ÿ…...
SQLMesh 系列教程7- 详解 seed 模型
SQLMesh 是一个强大的数据建模和管道管理工具,允许用户通过 SQL 语句定义数据模型并进行版本控制。Seed 模型是 SQLMesh 中的一种特殊模型,主要用于初始化和填充基础数据集。它通常包含静态数据,如参考数据和配置数据,旨在为后续的…...
