基于JAVA的用户画像活动推荐系统 开源项目

在这里插入图片描述


目录

  • 一、摘要
    • 1.1 项目介绍
    • 1.2 项目录屏
  • 二、功能模块
    • 2.1 数据中心模块
    • 2.2 兴趣标签模块
    • 2.3 活动档案模块
    • 2.4 活动报名模块
    • 2.5 活动留言模块
  • 三、系统设计
    • 3.1 用例设计
    • 3.2 业务流程设计
    • 3.3 数据流程设计
    • 3.4 E-R图设计
  • 四、系统展示
  • 五、核心代码
    • 5.1 查询兴趣标签
    • 5.2 查询活动推荐
    • 5.3 新增活动报名
    • 5.4 新增活动收藏
    • 5.5 新增活动留言
  • 六、免责说明


一、摘要

1.1 项目介绍

基于JAVA+Vue+SpringBoot+MySQL的用户画像活动推荐系统,使用了协同推荐算法,包含了标签管理、活动档案、活动收藏、活动报名、活动留言模块,还包含系统自带的用户管理、部门管理、角色管理、菜单管理、日志管理、数据字典管理、文件管理、图表展示等基础模块,用户画像活动推荐系统基于角色的访问控制,给活动管理员、普通用户使用,可将权限精确到按钮级别,您可以自定义角色并分配权限,系统适合设计精确的权限约束需求。

1.2 项目录屏


二、功能模块

系统平台设计包括系统网络配置、数据库选择、软件平台选择和硬件平台选择。该推荐系统前端使用了Vue.JS,采用MVVM的思想双向绑定界面和数据;后端采用了Java的框架SpringBoot,使用MyBatis整合MySQL数据库。

在这里插入图片描述

基于用户画像的活动推荐系统的功能性需求主要包含数据中心模块、兴趣标签模块、活动档案模块、活动报名模块、活动留言模块这五大模块,系统是基于浏览器运行的web管理后端,其中各个模块详细说明如下。

2.1 数据中心模块

数据中心模块包含了基于用户画像的活动推荐系统的系统基础配置,如登录用户的管理、运营公司组织架构的管理、用户菜单权限的管理、系统日志的管理、公用文件云盘的管理。
其中登录用户管理模块,由管理员负责运维工作,管理员可以对登录用户进行增加、删除、修改、查询操作。
组织架构,指的是高校的组织架构,该模块适用于管理这些组织架构的部门层级和教师的部门归属情况。
用户菜单权限管理模块,用于管理不同权限的用户,拥有哪些具体的菜单权限。
系统日志的管理,用于维护用户登入系统的记录,方便定位追踪用户的操作情况。
公用云盘管理模块,用于统一化维护基于用户画像的活动推荐系统中的图片,如合同签订文件、合同照片等等。

2.2 兴趣标签模块

兴趣标签是对用户进行活动推荐的标准,不同的用户可以有不同的兴趣标签,所以需要对兴趣标签进行维护,兴趣标签的数据包括标签名称、标签状态、排序值、备注、创建人、创建时间、更新人、更新时间,管理员可以新增、删除、编辑和条件查询兴趣标签数据,用户可以查询管理员发布的兴趣标签数据。

2.3 活动档案模块

活动是活动推荐系统的核心实体,需要建立活动档案模块对管理员发布的活动进行管理,活动的字段包括活动标题、活动介绍、活动地点、活动时间、创建人、创建时间、更新人、更新时间,管理员可以新增、删除、编辑和条件查询活动数据,用户可以查询管理员发布的活动数据。

2.4 活动报名模块

有了活动数据之后,用户就可以选择活动进行报名,进入页面后各种活动会呈现在用户面前,用户可以搜索活动,用户可以选择活动参加,活动报名的数据包括报名人、活动名称、报名日期、报名状态、创建人、创建时间、更新人、更新时间,管理员可以新增、删除、编辑和条件查询活动报名数据,用户可以申请活动报名,和查询我的历史活动报名信息。

2.5 活动留言模块

在使用基于用户画像的活动推荐系统中,用户可能会有一些问题需要咨询,所以建立了活动留言模块,活动留言数据包括留言人、留言内容、留言时间、状态、备注、回复人、回复内容、回复时间,用户可以发起活动留言,管理员可以对用户的留言进行回复和删除操作。


三、系统设计

3.1 用例设计

在这里插入图片描述

3.2 业务流程设计

在这里插入图片描述

3.3 数据流程设计

在这里插入图片描述
在这里插入图片描述

3.4 E-R图设计

在这里插入图片描述


四、系统展示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


五、核心代码

5.1 查询兴趣标签

@RequestMapping(value = "/getByPage", method = RequestMethod.GET)
@ApiOperation(value = "查询兴趣标签")
public Result<IPage<Label>> getByPage(@ModelAttribute Label label ,@ModelAttribute PageVo page){
    QueryWrapper<Label> qw = new QueryWrapper<>();
    if(!ZwzNullUtils.isNull(label.getTitle())) {
        qw.like("title",label.getTitle());
    }
    if(!ZwzNullUtils.isNull(label.getContent())) {
        qw.like("content",label.getContent());
    }
    IPage<Label> data = iLabelService.page(PageUtil.initMpPage(page),qw);
    return new ResultUtil<IPage<Label>>().setData(data);
}

5.2 查询活动推荐

@RequestMapping(value = "/getByPage", method = RequestMethod.GET)
@ApiOperation(value = "查询活动")
public Result<IPage<Activity>> getByPage(@ModelAttribute Activity activity ,@ModelAttribute PageVo page){
    /**
        * 接受前端传来的参数,开始模拟搜索
        */
    QueryWrapper<Activity> qw = new QueryWrapper<>();
    /**
        * 获取当前登录的用户对象
        */
    User currUser = securityUtil.getCurrUser();
    if(ZwzNullUtils.isNull(currUser.getLabel())) {
        currUser.setLabel("");
    }
    /**
        * 分析用户的兴趣标签
        */
    String[] labelList = currUser.getLabel().split(",");
    if(!ZwzNullUtils.isNull(activity.getTitle())) {
        qw.like("title",activity.getTitle());
    }
    if(!ZwzNullUtils.isNull(activity.getContent())) {
        qw.like("content",activity.getContent());
    }
    if(!ZwzNullUtils.isNull(activity.getStatus())) {
        qw.eq("status",activity.getStatus());
    }
    /**
        * 查询系统全部的活动留言数据
        */
    List<Message> messageList = iMessageService.list();
    /**
        * 查询系统全部的活动预定数据
        */
    List<ActivityOrder> orderList = iActivityOrderService.list();
    IPage<Activity> data = iActivityService.page(PageUtil.initMpPage(page),qw);
    for (Activity vo : data.getRecords()) {
        /**
            * 判断登录用户是否预定了这个活动
            */
        QueryWrapper<ActivityOrder> orderQw = new QueryWrapper<>();
        orderQw.eq("act_id",vo.getId());
        orderQw.eq("user_id",currUser.getId());
        vo.setOrderFlag(iActivityOrderService.count(orderQw));
        /**
            * 判断收藏
            */
        QueryWrapper<Collect> coQw = new QueryWrapper<>();
        coQw.eq("user_id",currUser.getId());
        coQw.eq("act_id",vo.getId());
        vo.setCoFlag(iCollectService.count(coQw));
        Long likeNumber = 0L;
        /**
            * 自己喜爱的活动,一个标签加十分
            */
        for (String s : labelList) {
            if(vo.getLabel().indexOf(s) > -1) {
                likeNumber += 10L;
            }
        }
        /**
            * 他人预定,每次加三分
            */
        for (ActivityOrder activityOrder : orderList) {
            if(Objects.equals(activityOrder.getActId(),vo.getId())) {
                likeNumber += 3L;
            }
        }
        /**
            * 被别人留言,每次加两分
            */
        for (Message message : messageList) {
            if(message.getContent().indexOf(vo.getTitle()) > -1) {
                likeNumber += 2L;
            }
        }
        vo.setLikeLevel(likeNumber);
    }
    /**
        * 最后对即将返回的活动数据,针对加权分值降序排序
        */
    Collections.sort(data.getRecords(), new Comparator<Activity>() {
        @Override
        public int compare(Activity o1, Activity o2) {
            return o2.getLikeLevel().compareTo(o1.getLikeLevel());
        }
    });
    /**
        * 返回给前端
        */
    return new ResultUtil<IPage<Activity>>().setData(data);
}

5.3 新增活动报名

@RequestMapping(value = "/addOne", method = RequestMethod.GET)
@ApiOperation(value = "新增单条活动报名")
public Result<ActivityOrder> addOne(@RequestParam String id){
    Activity activity = iActivityService.getById(id);
    if(activity == null) {
        return ResultUtil.error("活动不存在");
    }
    User currUser = securityUtil.getCurrUser();
    QueryWrapper<ActivityOrder> qw = new QueryWrapper<>();
    qw.eq("act_id",id);
    qw.eq("user_id",currUser.getId());
    iActivityOrderService.remove(qw);
    ActivityOrder order = new ActivityOrder();
    order.setActId(activity.getId());
    order.setTitle(activity.getTitle());
    order.setContent(activity.getContent());
    order.setAddress(activity.getAddress());
    order.setTime(activity.getTime());
    order.setUserId(currUser.getId());
    order.setUserName(currUser.getNickname());
    iActivityOrderService.saveOrUpdate(order);
    return ResultUtil.success();
}

5.4 新增活动收藏

@RequestMapping(value = "/addOne", method = RequestMethod.GET)
@ApiOperation(value = "新增收藏")
public Result<Object> addOne(@RequestParam String id){
    Activity a = iActivityService.getById(id);
    if(a == null) {
        return ResultUtil.error("活动不存在");
    }
    User currUser = securityUtil.getCurrUser();
    QueryWrapper<Collect> coQw = new QueryWrapper<>();
    coQw.eq("user_id",currUser.getId());
    coQw.eq("act_id",a.getId());
    long coCount = iCollectService.count(coQw);
    if(coCount < 1) {
        Collect c = new Collect();
        c.setUserId(currUser.getId());
        c.setUserName(currUser.getNickname());
        c.setActId(a.getId());
        c.setActTitle(a.getTitle());
        c.setTime(DateUtil.now());
        iCollectService.saveOrUpdate(c);
    }
    return ResultUtil.success();
}

5.5 新增活动留言

@RequestMapping(value = "/insert", method = RequestMethod.POST)
@ApiOperation(value = "新增活动留言")
public Result<Message> insert(Message message){
    Activity activity = iActivityService.getById(message.getActId());
    if(activity == null) {
        return ResultUtil.error("活动不存在");
    }
    message.setActTitle(activity.getTitle());
    User currUser = securityUtil.getCurrUser();
    message.setUserId(currUser.getId());
    message.setUserName(currUser.getNickname());
    message.setTime(DateUtil.now());
    message.setReplyContent("");
    message.setReplyName("");
    message.setReplyId("");
    message.setReplyTime("");
    iMessageService.saveOrUpdate(message);
    return new ResultUtil<Message>().setData(message);
}

六、免责说明

  • 本项目仅供个人学习使用,商用授权请联系博主,否则后果自负。
  • 博主拥有本软件构建后的应用系统全部内容所有权及独立的知识产权,拥有最终解释权。
  • 如有问题,欢迎在仓库 Issue 留言,看到后会第一时间回复,相关意见会酌情考虑,但没有一定被采纳的承诺或保证。

下载本系统代码或使用本系统的用户,必须同意以下内容,否则请勿下载!

  1. 出于自愿而使用/开发本软件,了解使用本软件的风险,且同意自己承担使用本软件的风险。
  2. 利用本软件构建的网站的任何信息内容以及导致的任何版权纠纷和法律争议及后果和博主无关,博主对此不承担任何责任。
  3. 在任何情况下,对于因使用或无法使用本软件而导致的任何难以合理预估的损失(包括但不仅限于商业利润损失、业务中断与业务信息丢失),博主概不承担任何责任。
  4. 必须了解使用本软件的风险,博主不承诺提供一对一的技术支持、使用担保,也不承担任何因本软件而产生的难以预料的问题的相关责任。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

中霖教育:CPA注册会计师报考注意事项有哪些?

在报考注册会计师时&#xff0c;以下这些注意事项你一定要了解! 1.CPA报考的条件 考生需要具备完全民事行为能力;具有高等专科以上学校毕业学历&#xff0c;或者具有会计或者相关专业中级以上技术职称。 2.专业阶段考试科目为&#xff1a; 《会计》、《审计》、《税法》、《…

ElasticSearch 学习9 spring-boot ,elasticsearch7.16.1实现中文拼音分词搜索

一、elasticsearch官网下载&#xff1a;Elasticsearch 7.16.1 | Elastic 二、拼音、ik、繁简体转换插件安装 ik分词&#xff1a;GitHub - medcl/elasticsearch-analysis-ik: The IK Analysis plugin integrates Lucene IK analyzer into elasticsearch, support customized d…

数据结构与算法:插入排序希尔排序

数据结构与算法&#xff1a;插入排序&希尔排序 插入排序希尔排序 插入排序 假设现在你有一个有序的数组&#xff0c;你要把一个数据插入到数组中&#xff0c;保证插入后依然有序&#xff0c;要怎么做&#xff1f; 对于人来说&#xff0c;这个问题就像是在整理扑克牌&…

第一个 OpenGL 程序:旋转的立方体(VS2022 / MFC)

文章目录 OpenGL API开发环境在 MFC 中使用 OpenGL初始化 OpenGL绘制图形重置视口大小 创建 MFC 对话框项目添加 OpenGL 头文件和库文件初始化 OpenGL画一个正方形OpenGL 坐标系改变默认颜色 重置视口大小绘制立方体使用箭头按键旋转立方体深度测试添加纹理应用纹理换一个纹理 …

0104 AJAX介绍

Ajax 的全称是 Asynchronous Javascript And XML &#xff08;异步 JavaScript 和 XML &#xff09;。 通俗的理解&#xff1a;在网页中利用 XMLHttpRequest 对象和服务器进行数据交互的方式&#xff0c;就是 Ajax Ajax 能让我们轻松实现网页与服务器之间的数据交互。 浏览器…

基础篇_数据持久化(实战-我的B站,MySQL数据库)

文章目录 一. 实战-我的B站1. 功能演示2. 设计数据类数据展示路径参数 3. 设计 Service 类静态资源映射读取文件的时机Stream API 改进 二. MySQL 数据库1. 数据库必要性2. MySQL 安装下载压缩包初始化数据库运行服务器运行客户端 3. 初步使用4. datagrip添加数据源导入数据用 …

【网络安全】【密码学】【北京航空航天大学】实验四、古典密码(上)【C语言实现】

实验四、古典密码&#xff08;上&#xff09; 一、实验目的 1、 通过本次实验&#xff0c;了解古典加密算法的主要思想&#xff0c;掌握常见的古典密码。 2、 学会应用古典密码&#xff0c;掌握针对部分古典密码的破译方法。 二、原理简介 古典密码的编码方法主要有两种&am…

【深度学习环境搭建】Windows搭建Anaconda3、已经Pytorch的GPU版本

目录 搭建Anaconda3搭建GPU版本的Pytorch你的pip也要换源&#xff0c;推荐阿里源打开conda的PowerShell验证 搭建Anaconda3 无脑下载安装包安装&#xff08;自行百度&#xff09; 注意点&#xff1a; 1、用户目录下的.condarc需要配置&#xff08;自定义环境的地址&#xff08…

【TC3xx芯片】TC3xx芯片电源管理系统PMS详解

目录 前言 正文 1.供电模式选择&#xff08;Supply Mode Selection&#xff09; 1.1 供电域 1.2 供电模式 1.3 供电阈值 1.4 供电上升和下降行为Supply Ramp-up and Ramp-down Behavior 1.5 EVRC产生供电 2. 电源监控 2.1 电源监控原理 2.2 Primary低电压监控 2.3 …

怎么把身份证压缩到200k以下?一分钟教你如图片压缩

在网络平台办理一些业务的时候&#xff0c;经常会需要上传我们的身份证照片&#xff0c;但是大多数平台为了用户体验&#xff0c;会限制上传的图片大小&#xff0c;比如图片不得超过200kb&#xff0c;当我们提交的身份证图片超出限制&#xff0c;就无法顺利提交&#xff1b;这时…

【Docker篇】使用Docker操作镜像

文章目录 &#x1f6f8;镜像&#x1f33a;基本操作⭐docker --help⭐docker pull [ 参数 ]⭐docker images⭐docker save -- 导出⭐docker rmi -- 删除⭐docker load -- 导入 &#x1f6f8;镜像 镜像是指在计算机领域中&#xff0c;通过复制和创建一个与原始对象相似的副本的过…

微信小程序快速入门02(含案例)

&#x1f3e1;浩泽学编程&#xff1a;个人主页 &#x1f525; 推荐专栏&#xff1a;《深入浅出SpringBoot》《java项目分享》 《RabbitMQ》《Spring》《SpringMVC》 &#x1f6f8;学无止境&#xff0c;不骄不躁&#xff0c;知行合一 文章目录 前言一、页面导航1.…

精确掌控并发:分布式环境下并发流量控制的设计与实现(一)

这是《百图解码支付系统设计与实现》专栏系列文章中的第&#xff08;10&#xff09;篇。 本篇主要讲清楚常用的并发流量控制方案&#xff0c;包括固定窗口、滑动窗口、漏桶、令牌桶、分布式消息中间件等&#xff0c;以及各种方案在支付系统不同场景下的应用。 在非支付场景&a…

若依实现前段后登录密码加密

若依虽然有加密解密功能&#xff0c;然后只有前端有&#xff0c;在用户点击保存密码的时候&#xff0c;会将密码保存到本地&#xff0c;但是为了防止密码泄露&#xff0c;所以在保存的时候&#xff0c;进行加密&#xff0c;在回显密码的时候进行解密显示&#xff0c;用户在登录…

上门回收小程序开发,让回收更加简单

资源回收一直是当下深受大众关注的话题&#xff0c;如何做到资源不浪费&#xff0c;成为了大众要考虑的问题。在人们环保意识的加深下&#xff0c;回收行业也是获得了大众的关注&#xff0c;逐渐形成了一个新的商业模式。 随着互联网技术的发展&#xff0c;回收行业也更加方便…

乱码问题汇总

写在前面 在工作中经常会碰到各种莫名其妙的乱码问题&#xff0c;但通过之前的学习&#xff1a;字符集&字符编码-CSDN博客 &#xff0c;可以知道乱码的根本原因就是使用和数据源编码不一样的编码解码导致。 如&#xff1a;BIG5解码GB2312编码内容&#xff0c;编解码不一致…

C++学习笔记(三十五):c++ 函数指针及lambda表达式

本节介绍c函数指针。在一些源码中经常能看到c函数指针&#xff0c;但之前一直觉着这一块比较复杂&#xff0c;就一直没去仔细研究&#xff0c;终于有时间去仔细研究这一块内容了。 c风格的函数指针 函数指针是指将一个函数赋值给一个变量的方法&#xff0c;可以将函数作为一个参…

Oracle篇—实例中和name相关参数的区别和作用

☘️博主介绍☘️&#xff1a; ✨又是一天没白过&#xff0c;我是奈斯&#xff0c;DBA一名✨ ✌✌️擅长Oracle、MySQL、SQLserver、Linux&#xff0c;也在积极的扩展IT方向的其他知识面✌✌️ ❣️❣️❣️大佬们都喜欢静静的看文章&#xff0c;并且也会默默的点赞收藏加关注❣…

可以在微信群里使用midjourney,gpt4,gemini,文心一言4.0,且免费

免费使用gpt4和midjourney 免费使用 参考链接&#xff1a; https://chat.xutongbao.top/

(核心变量)全国上市公司对外开放程度+dofile+参考文献(2000-2022年)

上市公司的对外开放程度数据反映了这些公司在国际市场上的活跃度和全球化程度。这包括了它们的国际贸易参与度、跨国投资和合作、国际市场的营销和品牌推广策略&#xff0c;以及在不同国家和地区的业务布局。此外&#xff0c;这段时间内不同行业和公司的对外开放程度可能有明显…