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

作者主页:编程千纸鹤

作者简介: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智能应用

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

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程千纸鹤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值