首页 > 编程语言 >基于协同过滤算法实现的同城玩乐推荐系统

基于协同过滤算法实现的同城玩乐推荐系统

时间:2024-09-11 17:54:35浏览次数:12  
标签:同城 玩乐 List 用户 算法 spring import com

作者主页:编程千纸鹤

作者简介:Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、多年校企合作经验,被多个学校常年聘为校外企业导师,指导学生毕业设计并参与学生毕业答辩指导,有较为丰富的相关经验。期待与各位高校教师、企业讲师以及同行交流合作

主要内容:Java项目、Python项目、前端项目、PHP、ASP.NET、人工智能与大数据、单片机开发、物联网设计与开发设计、简历模板、学习资料、面试题库、技术互助、就业指导等

业务范围:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文降重、长期答辩答疑辅导、腾讯会议一对一专业讲解辅导答辩、模拟答辩演练、和理解代码逻辑思路等

收藏点赞不迷路  关注作者有好处

文末获取源码 

项目编号:BS-PT-130

一,环境介绍

语言环境:Java:  jdk1.8

数据库:Mysql: mysql5.7

应用服务器:Tomcat:  tomcat8.5.31

开发工具:IDEA或eclipse

二,项目简介

本课题主要研究如何使用所学的软件开发技术开发设计出一款同城玩乐的推荐系统,用于展示同城店铺商家的同城玩乐的相关平台数据,并并利用协同过滤算法根据用户在平台上的交互数据,给平台用户进行更加精准的推荐,使得用户可以在平台上更加容易找到自己喜欢的各种吃喝玩乐的项目,节省时间去选择。

本课题主要使用Java开发语言进行开发,主要使用目前企业里常用的SpringBoot框架结合持久层框架Mybatis来进行实现后台服务接口设计和业务逻辑实现,并通过持久层框架封装JDBC持久化操作来完成对数据库的数据管理,前端使用Vue框架结合ElementUI组件来进行页面布局的开发,并结合AJAX异步交互来实现前后端的交互操作,数据存储采用Mysql数据库进行存储。主要实现的功能包括酒店查询预定、同城区域搜索店铺和在线预定门票、个性化店铺推荐、游玩攻略、资讯信息等相关功能模块。

前端用户使用情景描述:用户在注册并登录后,可以通过系统实现多种功能。主要包括在线浏览新闻信息、浏览预定酒店、浏览预定店铺门票信息、选择店铺出游路线规划设计,发布游玩攻略以及查看其他用户发布的店铺攻略信息。用户还能够查看系统推荐的店铺信息,并同时可以进行个人管理。此外,用户可以预定店铺票,并在个人中心处进行一系列操作,如发布个人的店铺攻略、查看已收藏的信息、以及查看预定的店铺等。这样的设计使用户体验更加全面,涵盖了各个方面的店铺相关信息和互动功能。

管理员用户用例图描述:管理员登录同城玩乐推荐系统后,主要负责管理平台的基础信息。这包括对前端注册的用户信息进行管理、轮播图的管理、资讯的管理、店铺的管理、酒店的管理、路线的管理、门票的管理、预定订单的管理以及攻略的管理等职责。管理员在系统中扮演着维护和监管平台正常运行的重要角色,通过对这些关键信息的管理,确保了系统的稳定性和良好运行。

三,系统展示

后台管理

管理员

四,核心代码展示

package com.spring.controller;

import com.alibaba.fastjson.*;
import com.spring.dao.JingquMapper;
import com.spring.entity.Huiyuan;
import com.spring.entity.Jingqu;
import com.spring.entity.Shoucang;
import com.spring.service.HuiyuanService;
import com.spring.service.JingquService;
import com.spring.service.ShoucangService;
import com.spring.util.*;
import java.util.*;

import com.spring.util.suanfa.Aprioti;
import com.spring.util.suanfa.Itemset;
import com.spring.util.xietong.XietongUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;

/**
 * 首页控制器
 */
@Controller
public class IndexController extends BaseController {

    @Autowired
    private HuiyuanService huiyuanService;
    @Autowired
    private ShoucangService shoucangService;
    @Autowired
    private JingquService jingquService;

    @Resource
    private JingquMapper dao;

    // 首页
    @RequestMapping(value = { "/", "index" })
    public String Index() {
        //首页展示轮播图
        List<Map> bhtList = Query.make("lunbotu").order("id desc").limit(5).select();
        assign("bhtList", bhtList);
        //首页展示酒店列表 根据ID倒序推荐显示最新的
        List<Map> jiudianlist5 = Query.make("jiudian").limit(4).order("id desc").select();
        assign("jiudianlist5", jiudianlist5);
        //新闻推荐列表:根据点击量
        List<Map> xinwenxinxilist8 = Query.make("xinwenxinxi").limit(6).order("dianjiliang desc").select();
        assign("xinwenxinxilist8", xinwenxinxilist8);
        //攻略推荐列表:根据ID倒序推荐
        List<Map> qianzhenglist9 = Query.make("qianzheng").limit(4).order("id desc").select();
        assign("qianzhenglist9", qianzhenglist9);

        //协同过滤算法推荐店铺
        List<Map> jingqulist7 = Query.make("jingqu").limit(4).order("liulanliang desc").select();
        assign("jingqulist7", jingqulist7);
        //判断用户是否登录:未登录用户按静默算法处理,己登录用户,根据收藏行为来进行数据推荐
        if(session.getAttribute("username")!=null){
           //1、查询所有用户
            List<Huiyuan> users = huiyuanService.select();
            Shoucang shoucang = new Shoucang();
            shoucang.setBiao("jingqu");
            List<Shoucang> dataList = shoucangService.select(shoucang);
            int usersize = users.size(); //用户总量
            /**
             * 输入用户-->物品条目  一个用户对应多个物品
             * 用户ID	物品ID集合
             *   A		a b d
             *   B		a c
             *   C		b e
             *   D		c d e
             */
            String[] userdata = new String[users.size()];
            for (int i = 0; i < users.size(); i++) {
                String zhanghao = users.get(i).getZhanghao().toString();
                String aa="A"+zhanghao+"";
                for (int j = 0; j < dataList.size(); j++) {
                    if(zhanghao.equals(dataList.get(j).getUsername().toString())){
                        aa+="@"+dataList.get(j).getXwid().toString();
                    }
                }
                userdata[i]= aa+="@0"; //补@0主要为了避免数据为空
                System.out.println("******"+aa);
            }
            String out = XietongUtil.xietongjob(usersize, userdata, "A"+session.getAttribute("username").toString());
            // String[] split = out.split(",");
            //List<Jingqu> jingqus = jingquService.listByIds(Arrays.asList(split));


            //注!为了应对一开始人员访问数据量不够推荐算法使用的情况,就进行了数据补足,这个业务逻辑就非常完美了。
            String sqlall="select a.*  from jingqu a where 1=1 ";
            String sql=sqlall;
            if(out!=null&&!"".equals(out)){
                sql+=" and id in ("+out.substring(1,out.length())+")";
            }
            sql+="  order by rand() limit 8 ";
            //以上推荐算法最总结果在根据随机安排推荐
            //不足8 位,随机补齐
            List<Map> tuijianList = db.queryForList(sql);
            int a = 8;
            int b = 0;
            if(tuijianList==null||tuijianList.size()<a){
                if(tuijianList!=null){
                    b = a-tuijianList.size();
                }
                List list2 = db.queryForList(sqlall+" order by rand() limit "+b);
                tuijianList.addAll(list2);
            }else{

            }
            List<Jingqu> jingqus = new ArrayList<>();
            for (Map map : tuijianList) {
                Jingqu jingqu = JSON.parseObject(JSON.toJSONString(map), Jingqu.class);
                jingqus.add(jingqu);
            }


            assign("tuijianlist", jingqus);
            //如果当前用户没有操作记录,则没有数据推荐,按静默处理
            if(jingqus.size()==0){
                //aprio推荐算法
                tuijiansuanfa(request);
            }
        }else{
            //也就是说,如果网站用户未登录,则不能身份确认,所以用aprio算法
            //aprio推荐算法
            tuijiansuanfa(request);
        }
        if (isAjax()) {
            return json();
        }
        return "index";
    }

    /**
     * 专门有个算法包
     * 然后算法的逻辑也在这里,
     * 而且把算法之外额逻辑也加了
     * 注!为了应对一开始人员访问数据量不够推荐算法使用的情况,就进行了数据补足,这个业务逻辑就非常完美了。
     *
     * java推荐算法
     * @param request
     */
    public void tuijiansuanfa(HttpServletRequest request){
        Itemset originalItem = new Itemset();
        List<Huiyuan> users = huiyuanService.select();
        for (int i = 0; i < users.size(); i++) {
            TreeSet<String> itemset = new TreeSet<String>();
            Shoucang shoucang = new Shoucang();
            shoucang.setBiao("jingqu");
            shoucang.setUsername(users.get(i).getZhanghao());
            List<Shoucang> dataList = shoucangService.select(shoucang);
            //循环获得每个用户收藏的店铺ID
            for (int j = 0; j < dataList.size(); j++) {
                itemset.add(dataList.get(j).getXwid()+"");
            }
            originalItem.itemset.add(itemset);
        }
        Aprioti.originalItem=originalItem;
        List<Long> outList = Aprioti.aprioriProcess();

        String in ="";
        if(outList!=null&&outList.size()>0){
            for (int i = 0; i < outList.size(); i++) {
                in+=","+outList.get(i);
            }
        }

        //注!为了应对一开始人员访问数据量不够推荐算法使用的情况,就进行了数据补足,这个业务逻辑就非常完美了。
        String sqlall="select a.*  from jingqu a where 1=1 ";
        String sql=sqlall;
        if(in!=null&&!"".equals(in)){
            sql+=" and id in ("+in.substring(1,in.length())+")";
        }
        sql+="  order by rand() limit 8 ";
        //以上推荐算法最总结果在根据随机安排推荐


        //不足8 位,随机补齐
        List<Map> tuijianList = db.queryForList(sql);
        int a = 8;
        int b = 0;
        if(tuijianList==null||tuijianList.size()<a){
            if(tuijianList!=null){
                b = a-tuijianList.size();
            }
            List list2 = db.queryForList(sqlall+" order by rand() limit "+b);
            tuijianList.addAll(list2);
        }else{

        }
        List<Jingqu> jingqus = new ArrayList<>();
        for (Map map : tuijianList) {
            Jingqu jingqu = JSON.parseObject(JSON.toJSONString(map), Jingqu.class);
            jingqus.add(jingqu);
        }
        //List<Jingqu> jingqus = jingquService.listByIds(tuijianList);
        assign("tuijianlist", jingqus);
        //request.setAttribute("tuijianList", tuijianList);
    }

}

五,相关作品展示

基于Java开发、Python开发、PHP开发、C#开发等相关语言开发的实战项目

基于Nodejs、Vue等前端技术开发的前端实战项目

基于微信小程序和安卓APP应用开发的相关作品

基于51单片机等嵌入式物联网开发应用

基于各类算法实现的AI智能应用

基于大数据实现的各类数据管理和推荐系统

 

 

标签:同城,玩乐,List,用户,算法,spring,import,com
From: https://blog.csdn.net/BS009/article/details/142052675

相关文章

  • 文心一言 VS 讯飞星火 VS chatgpt (344)-- 算法导论23.2 3题
    三、对于稀疏图G=(V,E)......
  • 文心一言 VS 讯飞星火 VS chatgpt (343)-- 算法导论23.2 2题
    二、假定我们用邻接矩阵来表示图G=(V,E)......
  • 复习排序算法
    备战acm校队第二天。实惨,排序学了好几年了,还是没有熟练,意难平啊。特此打开oi-wiki,从头到尾把排序敲一遍。选择排序比较简单。就是把数组里最大数找出来放到最后,然后再把第二大的找出来放在倒数第二位,依次类推,排序就结束了。注:TMD,Dev-C++原来不能把中文注释在代码,不然拷贝出来......
  • CheckSum算法--又名累加和校验算法
    校验和(Checksum)是网络协议使用的数据错误检测方法,并且被认为比LRC(纵向冗余校验,LongitudinalRedundancyCheck,LRC),VRC和CRC(循环冗余校验(CyclicRedundancyCodes,CRC))更可靠。此方法在发送方使用校验和生成器,在接收方使用校验和校验器。累加和校验算法的实现发送方:对要数据累加,得......
  • 前端算法(持续更新)
    1、最大的钻石1楼到n楼的每层电梯口都放着一个钻石,钻石大小不一。你从电梯1楼到n楼,每层楼电梯门都会打开一次,只能拿一次钻石,问怎样才能最大的钻石?解题思路:这是一个经典的动态规划问题,可以使用贪心算法来解决。以下是解决这个问题的思路:定义问题从1楼到n楼,每层楼电......
  • 前端常见算法题
    1、去除字符串中出现次数最少的字符,不改变原字符串的顺序实现删除字符串中出现次数最少的字符,若出现次数最少的字符有多个,则把出现次数最少的字符都删除。输出删除这些单词后的字符串,字符串中其它字符保持原来的顺序。“ababac”——“ababa”“aaabbbcceeff”——“aaa......
  • 【大模型理论篇】ToB的大模型系统非常有必要引入搜索推荐算法能力(回顾BPR、W&D、ALS等
    1.背景和思考              上周2024上海外滩大会如约而至,各种大咖云集,多种观点思想碰撞,带来很多新的启发。我个人比较关注大模型和隐私计算相关的内容,因此重点听了相关老师带来的行业前沿进展和深度思考。有两位老师的观点,特别认同,一位是百川智能的王小川......
  • 代码随想录算法训练营Day1
    目录704.二分查找 27.移除元素977.有序数组的平方 704.二分查找 分类:左闭右闭、左闭右开Tips:1.循环条件:左闭右闭:左索引<=右索引左闭右开:左索引<右索引2.循环操作:处理元素>目标值:左闭右闭:右索引=折半索引-1左闭右开:右索引=折半索引classSolution{......
  • 互联网算法备案必要性+攻略全流程详解【附件+流程】
    一、算法备案的重要性算法备案是指相关企业或组织向有关部门提交其使用的算法的相关信息,以接受监管和审查。这一举措有助于确保算法的公正性、透明性和合法性,保护用户的权益,促进数字经济的健康发展。算法备案必要性强制性例如,在推荐系统中,如果算法存在偏见或歧视,可能会导致......
  • 算法与数据结构——图的基础操作及图的遍历(广度优先与深度优先)
    图的实现基于邻接矩阵的实现给定一个顶点数量为n的无向图:初始化:传入n个顶点,初始化长度为n的顶点列表vertices,使用O(n)时间;初始化n*n大小的邻接矩阵adjMat,使用O(n2)时间。添加或删除边:直接在邻接矩阵中修改指定的边即可,使用O(1)时间。而由于是无向图,因此需要同时更新两个......