【基于springboot+Vue+Element ui的电影推荐之协同过滤算法简单实现】

基于springboot+Vue+Element ui的电影推荐之协同过滤算法简单实现

  • 1.基于用户的协同过滤算法的简单设计与实现
    • 1.1获取某个用户的评分矩阵
    • 1.2获取该用户与其他用户的相似度矩阵
    • 1.3获取两个用户之间的相似度并存储
    • 1.4返回推荐列表
  • 2.基于物品的协同过滤算法的简单设计与实现
    • 2.1计算物品相似度
    • 2.2生成推荐列表
  • 3.完整的RecommendAlgorithmService文件
  • 4.关于改进的思考

文件说明:
MovieSimilarityDao 功能是与电影相似度相关的操作
RatingMatrixDao 功能是与用户对电影的评分矩阵相关的数据操作
SimilarityDao 功能是与用户相似度矩阵相关的数据操作
MovieSimilarityService 功能是获取电影的相似度矩阵以及获取与当前电影的相似度最高的前若干部电影id
SimilarityService 功能是获取用户的相似度矩阵以及获取与当前用户的相似度最高的前若干个用户id
RatingMatrixService是查询某个用户的评分矩阵以及某个电影的评分矩阵,还有获取整个用户评分矩阵
RecommendAlgorithmService 功能是两种协同过滤算法的简单实现
项目采用springboot+Vue+Element ui,mysql 8.0,以及Maven项目管理工具,持久层框架是MyBatis,建议采用注解开发

1.基于用户的协同过滤算法的简单设计与实现

思路:先获取用户评分矩阵,再计算根据余弦相似度计算公式计算用户之间的相似度获取相似度矩阵,然后给出推荐列表。

1.1获取某个用户的评分矩阵

getRating方法是根据用户id获取该用户的评分矩阵

    public List<Map<Integer,Double>> getRating(Integer userid){//获取某个用户的评分矩阵List<Map<Integer,Double>> ratings=ratingMatrixService.getRatings(userid);System.out.println("该用户的评分矩阵:"+ratings);return ratings;}

评分实体类如下:

import lombok.*;
import org.springframework.stereotype.Component;@Data
@AllArgsConstructor
@NoArgsConstructor
@Component
public class RatingMatrix {//评分矩阵实体类private Integer userid;private Integer movieId;private Double rating;
}

获取该用户的评分矩阵

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;@Service
public class RatingMatrixService {@Resourceprivate JdbcTemplate jdbcTemplate;public RatingMatrixService(JdbcTemplate jdbcTemplate) {this.jdbcTemplate = jdbcTemplate;}public List<Map<Integer, Double>> getRatings(Integer userid) {//获取用户评分矩阵String query = "SELECT userid, movieId, rating FROM ratings where userid="+userid;List<Map<Integer, Double>> userRatings = new ArrayList<>();jdbcTemplate.query(query, rs -> {while (rs.next()) {int movieId = rs.getInt("movieId");double rating = rs.getDouble("rating");// 将评分数据存入MapMap<Integer, Double> userRatingMap = new HashMap<>();userRatingMap.put(movieId, rating);// 将Map添加到List中userRatings.add(userRatingMap);}});return userRatings;}public List<Map<Integer, Double>> getRatingsByMovieId(Integer movieId) {//获取电影评分矩阵String query = "SELECT userid, rating FROM ratings where movieId="+movieId;List<Map<Integer, Double>> ratings = new ArrayList<>();List<Map<String, Object>> movieRatings = jdbcTemplate.queryForList(query);for(Map<String, Object> row:movieRatings){int userid = (int) row.get("userid");double rating = (double) row.get("rating");// 将评分数据存入MapMap<Integer, Double> movieRatingMap = new HashMap<>();movieRatingMap.put(userid,rating);// 将Map添加到List中ratings.add(movieRatingMap);}return ratings;}public List<Map<Integer, Map<Integer, Double>>> getRatingMatrix() {//获取整个用户评分矩阵List<Map<Integer, Map<Integer, Double>>> ratingMatrix = new ArrayList<>();String sql = "SELECT * FROM ratings";List<Map<String, Object>> rows = jdbcTemplate.queryForList(sql);for (Map<String, Object> row : rows) {int userid = (int) row.get("userid");int movieId = (int) row.get("movieId");double rating = (double) row.get("rating");Map<Integer, Double> movieRatings = new HashMap<>();movieRatings.put(movieId, rating);  // 将电影ID放在前面boolean found = false;for (Map<Integer, Map<Integer, Double>> userRatings : ratingMatrix) {if (userRatings.containsKey(userid)) {userRatings.get(userid).put(movieId, rating);  // 将用户ID放在前面found = true;break;}}if (!found) {Map<Integer, Map<Integer, Double>> userRatingsMap = new HashMap<>();userRatingsMap.put(userid, movieRatings);  // 将用户ID放在前面ratingMatrix.add(userRatingsMap);}}return ratingMatrix;}}

1.2获取该用户与其他用户的相似度矩阵

用户相似度的实体类如下

import lombok.*;
import org.springframework.stereotype.Component;@Data
@AllArgsConstructor
@NoArgsConstructor
@Component
public class Similarity {//用户相似度实体类private Integer userid1;private Integer userid2;private double similarity;
}

获取相似度矩阵

public List<Map<Integer,Double>> getSimilarity(Integer userid){//获取用户的相似度矩阵List<Map<Integer,Double>> similarities=similarityService.getSimilarities(userid);System.out.println("用户相似度矩阵:"+similarities);return similarities;}

其中的SimilarityService.java如下

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;import javax.annotation.Resource;
import java.util.*;@Service
public class SimilarityService {@Resourceprivate JdbcTemplate jdbcTemplate;public List<Map<Integer, Double>> getSimilarities(Integer userid1){//获取用户相似度矩阵String query = "SELECT userid2, similarity FROM similarities where userid1='" + userid1 + "'";List<Map<Integer, Double>> userSimilarity = new ArrayList<>();List<Map<String, Object>> resultList = jdbcTemplate.queryForList(query);for (Map<String, Object> row : resultList) {int userid2 = (int) row.get("userid2");double similarity = (double) row.get("similarity");// 将评分数据存入MapMap<Integer, Double> userRatingMap = new HashMap<>();userRatingMap.put(userid2, similarity);// 将Map添加到List中userSimilarity.add(userRatingMap);}return userSimilarity;}//遍历相似度矩阵找出相似度最高的前五个用户public List<Integer> getTopFiveSimilarUsers(List<Map<Integer,Double>> similarityMatrix){List<Integer> topFiveUsers = new ArrayList<>();// 将相似度矩阵转换为一个包含所有相似度的列表List<Double> allSimilarities = new ArrayList<>();for (Map<Integer, Double> userSimilarities : similarityMatrix) {for (Double similarity : userSimilarities.values()) {allSimilarities.add(similarity);}}// 对相似度进行快速排序allSimilarities.sort(Collections.reverseOrder());// 取出前五个相似度最高的用户for (int i = 0; i < Math.min(5, allSimilarities.size()); i++) {Double similarity = allSimilarities.get(i);for (Map<Integer, Double> userSimilarities : similarityMatrix) {for (Map.Entry<Integer, Double> entry : userSimilarities.entrySet()) {if (entry.getValue().equals(similarity) && !topFiveUsers.contains(entry.getKey())) {topFiveUsers.add(entry.getKey());break;}}}}return topFiveUsers;}
}

1.3获取两个用户之间的相似度并存储

 public Double getSimilarity(Integer user1,Integer user2){//获取两个用户之间的相似度CollaborativeFiltering collaborativeFiltering=new CollaborativeFiltering();List<Map<Integer, Double>> list1 = ratingMatrixService.getRatings(user1);//2List<Map<Integer, Double>> list2 = ratingMatrixService.getRatings(user2);//5double similarity = collaborativeFiltering.calculateSimilarity(list1,list2);Similarity similarity1=new Similarity(user1,user2,similarity);//存储用户相似度similarityDao.addSimilarity(similarity1);System.out.println("用户"+user1+"和用户"+user2+"之间的相似度为:"+similarity);return similarity;}

其中的CollaorativeFiletering.java如下

import java.util.*;
public class CollaborativeFiltering {//采用余弦相似度计算公式计算两个用户的相似度public Double calculateSimilarity(List<Map<Integer, Double>> list1, List<Map<Integer, Double>> list2){//计算用户相似度// 计算余弦相似度double dotProduct = 0.0;double normA = 0.0;double normB = 0.0;for (Map<Integer, Double> map1 : list1) {for (Map<Integer, Double> map2 : list2) {for (Map.Entry<Integer, Double> entry1 : map1.entrySet()) {for (Map.Entry<Integer, Double> entry2 : map2.entrySet()) {if (entry1.getKey().equals(entry2.getKey())) {dotProduct += entry1.getValue() * entry2.getValue();normA += Math.pow(entry1.getValue(), 2);normB += Math.pow(entry2.getValue(), 2);}}}}}if (normA == 0 || normB == 0) {return 0.0; // 避免除以零}double similarity = dotProduct / (Math.sqrt(normA) * Math.sqrt(normB));return similarity;}
}

这里采用的是余弦相似度计算公式计算用户的相似度,具体内容点击这里

1.4返回推荐列表

 public Set<Integer> getRecommendList(Integer userid){System.out.println("获取推荐列表");//获取用户相似度矩阵List<Map<Integer,Double>> similarities=similarityService.getSimilarities(userid);//遍历该相似度矩阵找出最相似的前五个用户idList<Integer> userids=similarityService.getTopFiveSimilarUsers(similarities);//把这些用户喜欢的电影,评分高的电影推荐给当前用户//获取这些用户喜欢的电影Set<Integer> movieids=movieService.getUsersLikedMovies(userids);//获取这些用户里评分最高的电影idSet<Integer> movieids1=movieService.getMaxRatingMovie(userids);//把两个集合合并并去重movieids.addAll(movieids1);System.out.println("电影的推荐列表为:"+movieids);return movieids;}

2.基于物品的协同过滤算法的简单设计与实现

原理是物品A与物品B具有很大的相似度是因为喜欢物品A的用户大都也喜欢物品B,因此先计算两个item的相似度,再基于物品相似度以及用户喜好的item类型生成推荐列表。

2.1计算物品相似度

 public double calculateItemSimilarity(Integer movie1,Integer movie2){//计算两个电影的相似度CollaborativeFiltering collaborativeFiltering=new CollaborativeFiltering();//获取电影1和电影2的评分集合List<Map<Integer,Double>> list1=ratingMatrixService.getRatingsByMovieId(movie1);List<Map<Integer,Double>> list2=ratingMatrixService.getRatingsByMovieId(movie2);System.out.println(list1);System.out.println(list2);//计算电影1和电影2的余弦相似度double similarity=collaborativeFiltering.calculateSimilarity(list1,list2);//存储电影相似度movieSimilarityDao.addMovieSimilarity(movie1,movie2,similarity);return similarity;}

这里同样采用余弦相似度计算公式计算两个电影的相似度,值得注意的是从数据库里查询到的结果需要先存到Map集合里再存到list里

2.2生成推荐列表

public Set<Integer> getRecommendMovieList(Integer movieId){//获取与该电影的推荐列表System.out.println("获取电影的推荐列表");//获取电影相似度矩阵List<Map<Integer,Double>> similarities=movieSimilarityService.getSimilarities(movieId);//遍历该相似度矩阵找出最相似的前十个电影idList<Integer> movieids=movieSimilarityService.getTopTenSimilarMovies(similarities);//把和当前电影相似度高的电影推荐给用户Set<Integer> recommendMovieList=new HashSet<>();if(movieids.isEmpty()){//按电影类型推荐String movieType=movieService.getMovieByType(movieId);List<String> movieTypes=splitStringByComma(movieType);for(String type:movieTypes){Set<Integer> typeMovies=movieService.getMoviesByType(type,movieId);System.out.println("该类型电影为:"+typeMovies);recommendMovieList.addAll(typeMovies);}}else{String movieType=movieService.getMovieByType(movieId);List<String> movieTypes=splitStringByComma(movieType);for(String type:movieTypes){Set<Integer> typeMovies=movieService.getMoviesByType(type,movieId);recommendMovieList.addAll(typeMovies);}recommendMovieList.addAll(movieids);}return recommendMovieList;}

其中的MovieSimilarityService.java如下:

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;import javax.annotation.Resource;
import java.util.*;@Service
public class MovieSimilarityService {@Resourceprivate JdbcTemplate jdbcTemplate;public List<Map<Integer, Double>> getSimilarities(Integer movieId1){//获取电影相似度矩阵String query = "SELECT movieId2, similarity FROM moviesimilarity where movieId1='" + movieId1+ "'";List<Map<Integer, Double>> movieSimilarity = new ArrayList<>();List<Map<String, Object>> resultList = jdbcTemplate.queryForList(query);for (Map<String, Object> row : resultList) {int movieId2 = (int) row.get("movieId2");double similarity = (double) row.get("similarity");// 将评分数据存入MapMap<Integer, Double> movieRatingMap = new HashMap<>();movieRatingMap.put(movieId2, similarity);// 将Map添加到List中movieSimilarity.add(movieRatingMap);}return movieSimilarity;}public List<Integer> getTopTenSimilarMovies(List<Map<Integer, Double>> similarityMatrix) {List<Integer> topTenMovies = new ArrayList<>();// 将相似度矩阵转换为一个包含所有相似度的列表List<Double> allSimilarities = new ArrayList<>();for (Map<Integer, Double> movieSimilarities : similarityMatrix) {for (Double similarity : movieSimilarities.values()) {allSimilarities.add(similarity);}}// 对相似度进行快速排序allSimilarities.sort(Collections.reverseOrder());// 取出前五个相似度最高的用户for (int i = 0; i < Math.min(10, allSimilarities.size()); i++) {Double similarity = allSimilarities.get(i);for (Map<Integer, Double> movieSimilarities : similarityMatrix) {for (Map.Entry<Integer, Double> entry : movieSimilarities.entrySet()) {if (entry.getValue().equals(similarity) && !topTenMovies.contains(entry.getKey())) {topTenMovies.add(entry.getKey());break;}}}}return topTenMovies;}
}

3.完整的RecommendAlgorithmService文件

import com.example.Dao.MovieSimilarityDao;
import com.example.Dao.SimilarityDao;
import com.example.entity.Similarity;
import com.example.utils.CollaborativeFiltering;
import org.springframework.stereotype.Service;import javax.annotation.Resource;
import java.util.*;@Service
public class RecommendAlgorithmService{//推荐算法的完整过程@Resourceprivate RatingMatrixService ratingMatrixService;@Resourceprivate SimilarityService similarityService;@Resourceprivate SimilarityDao similarityDao;@Resourceprivate MovieService movieService;@Resourceprivate MovieSimilarityDao movieSimilarityDao;@Resourceprivate MovieSimilarityService movieSimilarityService;//(1)基于用户的协同过滤算法的简单设计与实现//1.获取用户评分矩阵//2.计算用户之间的相似度,获取相似度矩阵//3.给出推荐列表public List<Map<Integer,Double>> getRating(Integer userid){//获取某个用户的评分矩阵List<Map<Integer,Double>> ratings=ratingMatrixService.getRatings(userid);System.out.println("该用户的评分矩阵:"+ratings);return ratings;}public List<Map<Integer,Double>> getSimilarity(Integer userid){//获取用户的相似度矩阵List<Map<Integer,Double>> similarities=similarityService.getSimilarities(userid);System.out.println("用户相似度矩阵:"+similarities);return similarities;}public List<Map<Integer,Map<Integer,Double>>> getRatingMatrix(){//获取整个评分矩阵List<Map<Integer,Map<Integer,Double>>> mapList=ratingMatrixService.getRatingMatrix();System.out.println("整个用户的评分矩阵:"+mapList);return mapList;}public Double getSimilarity(Integer user1,Integer user2){//获取两个用户之间的相似度CollaborativeFiltering collaborativeFiltering=new CollaborativeFiltering();List<Map<Integer, Double>> list1 = ratingMatrixService.getRatings(user1);//2List<Map<Integer, Double>> list2 = ratingMatrixService.getRatings(user2);//5double similarity = collaborativeFiltering.calculateSimilarity(list1,list2);Similarity similarity1=new Similarity(user1,user2,similarity);//存储用户相似度similarityDao.addSimilarity(similarity1);System.out.println("用户"+user1+"和用户"+user2+"之间的相似度为:"+similarity);return similarity;}public Set<Integer> getRecommendList(Integer userid){System.out.println("获取推荐列表");//获取用户相似度矩阵List<Map<Integer,Double>> similarities=similarityService.getSimilarities(userid);//遍历该相似度矩阵找出最相似的前五个用户idList<Integer> userids=similarityService.getTopFiveSimilarUsers(similarities);//把这些用户喜欢的电影,评分高的电影推荐给当前用户//获取这些用户喜欢的电影Set<Integer> movieids=movieService.getUsersLikedMovies(userids);//获取这些用户里评分最高的电影idSet<Integer> movieids1=movieService.getMaxRatingMovie(userids);//把两个集合合并并去重movieids.addAll(movieids1);System.out.println("电影的推荐列表为:"+movieids);return movieids;}//(2)基于物品的协同过滤算法的简单设计与实现//物品A和物品B具有很大的相似度是因为喜欢物品A的用户大都也喜欢物品B//1.计算物品之间的相似度//2.基于物品的相似度和用户的喜好生成推荐列表public double calculateItemSimilarity(Integer movie1,Integer movie2){//计算两个电影的相似度CollaborativeFiltering collaborativeFiltering=new CollaborativeFiltering();//获取电影1和电影2的评分集合List<Map<Integer,Double>> list1=ratingMatrixService.getRatingsByMovieId(movie1);List<Map<Integer,Double>> list2=ratingMatrixService.getRatingsByMovieId(movie2);System.out.println(list1);System.out.println(list2);//计算电影1和电影2的余弦相似度double similarity=collaborativeFiltering.calculateSimilarity(list1,list2);//存储电影相似度movieSimilarityDao.addMovieSimilarity(movie1,movie2,similarity);return similarity;}public Set<Integer> getRecommendMovieList(Integer movieId){//获取与该电影的推荐列表System.out.println("获取电影的推荐列表");//获取电影相似度矩阵List<Map<Integer,Double>> similarities=movieSimilarityService.getSimilarities(movieId);//遍历该相似度矩阵找出最相似的前十个电影idList<Integer> movieids=movieSimilarityService.getTopTenSimilarMovies(similarities);//把和当前电影相似度高的电影推荐给用户Set<Integer> recommendMovieList=new HashSet<>();if(movieids.isEmpty()){//按电影类型推荐String movieType=movieService.getMovieByType(movieId);List<String> movieTypes=splitStringByComma(movieType);for(String type:movieTypes){Set<Integer> typeMovies=movieService.getMoviesByType(type,movieId);System.out.println("该类型电影为:"+typeMovies);recommendMovieList.addAll(typeMovies);}}else{String movieType=movieService.getMovieByType(movieId);List<String> movieTypes=splitStringByComma(movieType);for(String type:movieTypes){Set<Integer> typeMovies=movieService.getMoviesByType(type,movieId);recommendMovieList.addAll(typeMovies);}recommendMovieList.addAll(movieids);}return recommendMovieList;}public List<String> splitStringByComma(String input) {//将电影类型按照逗号分割// 检查输入字符串是否为空if (input == null || input.isEmpty()) {return Collections.emptyList();}// 使用逗号分隔字符串,并返回结果return Arrays.asList(input.split(","));}
}

4.关于改进的思考

可以看到当前我们的功能里面采用余弦相似度计算公式计算物品相似度的时候会出问题。为什么呢?首先,以图书为例,如果两个用户都买过新华字典,这丝毫不能说明他们爱好相似,因为我们小时候曾经都买过新华字典但如果两个用户都买过数据挖掘导论,那么可以认为他们爱好比较相似,因为只有研究数据挖掘的人才会买这本书。换句话说,两个用户对冷门物品的相似购买行为更能说明用户之间的相似度,因此可以继续在此基础上基于用户行为计算用户的爱好相似度,这里不再赘述,请自行搜索各位大佬的相似度改进方法。

关于代码只是自己关于协同过滤算法的简单实现,若有错误或者需要改进的地方欢迎各位大佬给出宝贵意见。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/732497.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

蓝桥杯每日一题(哈希、单调队列)

2058 笨拙的手指 二进制所有的可能保存进哈希表&#xff0c;三进制找出所有的可能判断哈希表中是否有数字。 注意一种情况就是修改完之后出现前导零。直接continue; 学到了&#xff0c;某些条件的限制不一定要在循环条件上&#xff0c;可以直接在循环体内。 #include<bi…

运维:记一次寻找定时任务并删除的经历

前言 我相信接手别人的服务器、或者在没有任何文档的情况去看自己原先的服务器,都或多或少会遇到莫名其妙的服务器独有规则。 比如你服务本身跑的好好的,突然啪的一下,没了! 什么原因导致的呢?其中,很大可能是定时任务在作祟。 原因分析 本次,我遇到的问题是:在Ubuntu系…

一分钟了解遥感中卫星、传感器、波段及数据之间的关系

感是利用卫星、飞机或其他载具上的传感器对地球表面进行观测和测量的科学技术。以下是一些常见的遥感相关术语: 卫星(Satellite):在遥感中,卫星是指绕地球轨道运行的人造卫星,其主要任务是携带各种传感器从空间中对地球表面进行观测。 传感器(Sensor):传感器是安装在卫…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:ImageSpan)

Text组件的子组件&#xff0c;用于显示行内图片。 说明&#xff1a; 该组件从API Version 10开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 无 接口 ImageSpan(value: ResourceStr | PixelMap) 参数&#xff1a; 参数名参数类…

抓包工具获取请求信息

Charles 下载安装 下载 官方下载地址&#xff1a;https://www.charlesproxy.com/latest-release/download.do 下载后傻瓜式安装就好&#xff0c;这个官方的需要激活&#xff0c;可以选择绿色版或者学习版 绿色版 绿色中文版&#xff1a;https://soft.kxdw.com/pc/Charles.z…

【代码】Android|获取存储权限并创建、存储文件

版本&#xff1a;Android 11及以上&#xff0c;gradle 7.0以上&#xff0c;Android SDK > 29 获取存储权限 获取存储权限参考&#xff1a;Android 11 外部存储权限适配指南及方案&#xff0c;这篇文章直接翻到最下面&#xff0c;用XXPermissions框架。它漏了这个框架的使用方…

opencv实现视频人脸识别

一. 实现指定图像的人脸识别 注意&#xff1a; 以下实例参考《OpenCV轻松入门面向Python》李立宗著&#xff0c;使用python语言&#xff0c;编辑器为PyCharm&#xff0c;且都运行成功。 1.dface3.jpg图片文件和当前代码放在同一级目录下。 2.级联分类器文件和当前代码文件放在…

MapReduce-Partition分区

Partition分区 1.默认Partitioner分区 (key.hashcode() & Interger.MAX_VALUE) % numReduceTasksnumReduceTasks默认为&#xff1a;1 //输出文件一个默认分区根据key的hashCode对ReduceTasks个数取模。 用户控制那个key存储到那个分区2.手动设置分区 //设置分区 job.set…

笔记78:软件包管理工具 apt 详解(包含常用 apt 命令介绍)

一、Ubuntu 的包管理工具 apt 过去&#xff0c;软件通常是从源代码安装的&#xff0c;安装步骤为&#xff1a;​​​​​​ 在Github上下载该软件的源码文件&#xff1b;查看Github上这个软件项目中提供的自述文件&#xff08;通常包含配置脚本或 makefile 文件&#xff09;&a…

软件架构的风格

1.数据流风格 数据流风格中&#xff0c;所有的数据按照流的形式在执行过程中前进&#xff0c;不存在结构的反复和重构&#xff0c;就像工厂中的汽车流水线一样&#xff0c;数据在流水线的各个节点上被加工。每完成一个环节&#xff0c;数据流都会被送入下一个环节&#xff0c;最…

Harbor二次开发前端环境搭建

1 前端开发环境搭建 &#xff08;1&#xff09;拉取分支代码 &#xff08;2&#xff09;前端开发推荐使用VsCode编辑器打开项目 打开 harbor\src\portal 文件夹&#xff0c;该文件夹为Harbor对应的前端代码所在位置 &#xff08;3&#xff09;在portal文件夹下创建名为 pro…

【Springer出版 · EI检索】| 第二届先进无人飞行系统国际会议(ICAUAS 2024)

会议简介 Brief Introduction 2024年第二届先进无人飞行系统国际会议(ICAUAS 2024) 会议时间&#xff1a;2024年6月14日-16日 召开地点&#xff1a;中国南昌 大会官网&#xff1a;ICAUAS 2024-2024 2nd International Conference on Advanced Unmanned Aerial Systems2024 2nd …

java SSM汽车租赁管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM汽车租赁管理系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用…

朴素贝叶斯基本原理sklearn实现

理论 先验概率&#xff1a;根据以往的分析经验得到的概率&#xff0c;先验概率不需要样本数据 后验概率&#xff1a;根据数据的特征进行分析 联合概率&#xff1a;几个事件同时发生的概率&#xff0c;P(瓜熟&#xff0c;瓜蒂脱落&#xff09; 定义 贝叶斯分类是一类分类算法的…

江大白 | 万字长文,算法工程师的深度经验总结!(建议阅读收藏!)

本文来源公众号“OpenCV与AI深度学习”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;万字长文&#xff0c;算法工程师的深度经验总结&#xff01; 以下文章来源于知乎&#xff1a;机智的叉烧 链接&#xff1a;https://zhuanlan…

【Spring高级】第3讲 Bean的生命周期

目录 基本的生命周期后处理器总结 基本的生命周期 为了演示生命周期的过程&#xff0c;我们直接使用 SpringApplication.run()方法&#xff0c;他会直接诶返回一个容器对象。 import org.springframework.boot.SpringApplication; import org.springframework.context.Config…

JAVA实战开源项目:智能停车场管理系统(Vue+SpringBoot)

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容A. 车主端功能B. 停车工作人员功能C. 系统管理员功能1. 停车位模块2. 车辆模块3. 停车记录模块4. IC卡模块5. IC卡挂失模块 三、界面展示3.1 登录注册3.2 车辆模块3.3 停车位模块3.4 停车数据模块3.5 IC卡档案模块3.6 IC卡挂…

opengl 学习(三)-----纹理

纹理就是贴图 分类前提demo效果解析 分类 前提 需要使用一个库来处理图片&#xff1a;#include <stb_image.h> https://github.com/nothings/stb 你下载好了之后&#xff0c;把目目录包含了就好 然后再引入 #define STB_IMAGE_IMPLEMENTATION #include "stb_i…

QEMU源码全解析 —— virtio(27)

接前一篇文章: 上一回解析了setup_vq函数的前3步,本回继续解析余下的步骤。为了便于理解和加深印象,再次贴出setup_vq函数的源码,在Linux内核源码/drivers/virtio/virtio_pci_modern.c中,代码如下: static struct virtqueue *setup_vq(struct virtio_pci_device *vp_dev…

git删除comimit提交的记录

文章目录 本地的删除远程同步修改上次提交更多详情阅读 本地的删除 例如我的提交历史如下 commit 58211e7a5da5e74171e90d8b90b2f00881a48d3a Author: test <test36nu.com> Date: Fri Sep 22 20:55:38 2017 0800add d.txtcommit 0fb295fe0e0276f0c81df61c4fd853b7a00…