Java实现用户画像活动推荐系统 JAVA+Vue+SpringBoot+MySQL

在这里插入图片描述


目录

  • 一、摘要
    • 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/385418.html

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

相关文章

【实战】一、Jest 前端自动化测试框架基础入门(中) —— 前端要学的测试课 从Jest入门到TDD BDD双实战(二)

文章目录 一、Jest 前端自动化测试框架基础入门5.Jest 中的匹配器toBe 匹配器toEqual匹配器toBeNull匹配器toBeUndefined匹配器和toBeDefined匹配器toBeTruthy匹配器toBeFalsy匹配器数字相关的匹配器字符串相关的匹配器数组相关的匹配器异常情况的匹配器 6.Jest 命令行工具的使…

综合项目---博客

一.运行环境 192.168.32.132 Server-Web linux Web 192.168.32.133 Server-NFS-DNS linux NFS/DNS 基础配置 1.配置主机名静态ip 2.开启防火墙并配置 3.部分开启selinux并配置 4.服务器之间通过阿里云进行时间同步 5.服务器之间实现ssh免密…

图神经网络与图表示学习: 从基础概念到前沿技术

目录 前言1 图的形式化定义和类型1.1 图的形式化定义1.2 图的类型 2 图表示学习2.1 DeepWalk: 融合语义相似性与图结构2.2 Node2Vec: 灵活调整随机游走策略2.3 LINE: 一阶与二阶邻接建模2.4 NetMF: 矩阵分解的可扩展图表示学习2.5 Metapath2Vec: 异构图的全面捕捉 3 图神经网络…

红队打靶练习:DEVGURU: 1

目录 信息收集 1、arp 2、nmap 3、dirsearch WEB web信息收集 8585端口 漏洞利用 提权 系统信息收集 横向渗透 get flag 信息收集 1、arp ┌──(root㉿ru)-[~/kali] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:50:56:20:80:1b, IPv4: 192.168.10…

【白话前端】快速区分webGL,webGPU,unity3D和UE4

在3D图形渲染的渲染领域&#xff0c;很多友友们对上述概念傻傻分不清&#xff0c;站在前端开发角度&#xff0c;我用简单语言说下&#xff0c;结论在文章最后。 一、四者都能进行3D图形渲染 它们之间有一些区别&#xff0c;下面我将对它们进行简单的区分&#xff1a; WebGPU&a…

iTop-4412 裸机程序(二十一)- 蜂鸣器与PWM

目录 0.源码1. 蜂鸣器2. iTop-4412 蜂鸣器原理图3. PWM相关寄存器4. 关键源码 0.源码 GitHub&#xff1a;https://github.com/Kilento/4412NoOS 1. 蜂鸣器 蜂鸣器的原理相对简单&#xff0c;学过单片机的同学应该比较了解。我们一般通过引脚输出PWM的输出频率和占空比来控制…

用Python探秘2024年春晚刘谦魔术:两步揭开神秘面纱

在2024年的春晚舞台上&#xff0c;刘谦的魔术表演再次引发了全国观众的热议。他的每一个动作、每一次变换都充满了神秘与未知&#xff0c;让人在惊叹的同时也好奇其背后的秘密。今天&#xff0c;我们将用Python来模拟实现刘谦的一个魔术&#xff0c;并尝试通过两步揭秘其背后的…

标题:探究t-table在Vue.js中的实现与运用 ,可用于数据分析表格展示

标题:探究t-table在Vue.js中的实现与运用 ,可用于数据分析表格展示 一、引言 在当今的Web开发中,表格是一种常见的界面元素,用于展示和操作数据。Vue.js是一款流行的JavaScript框架,具有响应式数据绑定和组件化的特点。在Vue.js中,t-table是一种常用的表格组件,具有高度…

王树森《RNN Transformer》系列公开课

本课程主要介绍NLP相关&#xff0c;包括RNN、LSTM、Attention、Transformer、BERT等模型&#xff0c;以及情感识别、文本生成、机器翻译等应用 ShusenWang的个人空间-ShusenWang个人主页-哔哩哔哩视频 (bilibili.com) &#xff08;一&#xff09;NLP基础 1、数据处理基础 数…

C语言函数入门

在C语言中&#xff0c;函数意味着功能模块。一个典型的C语言程序&#xff0c;就是由一个个的功能模块拼接起来的整体。也因为如此&#xff0c;C语言被称为模块化语言。 对于函数的使用者&#xff0c;可以简单地将函数理解为一个黑箱&#xff0c;使用者只管按照规定给黑箱一些输…

中年中产程序员从西安出发到海南三亚低成本吃喝万里行:西安-南宁-湛江-雷州-徐闻-博鳌-陵水-三亚-重庆-西安(2.游玩过程)

文章大纲 出发时间&#xff1a;Day1-1月25日星期四&#xff0c;西安飞南宁路途中&#xff1a;Day2-1月26日星期五&#xff0c;南宁-湛江-住雷州&#xff08;曾经支教过的地方&#xff09;【晚上买徐闻到海安新港】路途中&#xff1a;Day3-1月27日星期六&#xff0c;雷州-徐闻渡…

【每日一题】LeetCode——反转链表

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更新的动力❤️ &#x1f64f;小杨水平有…

基于RBF神经网络的自适应控制器simulink建模与仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1自适应控制器 4.2 RBF神经网络模型 5.完整程序 1.程序功能描述 在simulink中&#xff0c;使用S函数编写基于RBF神经网络的自适应控制器&#xff0c;然后实现基于RBF神经网络的自适应控制…

如何进行前端自动化测试

如何进行前端自动化测试使用Puppeteer进行前端自动化测试 使用Puppeteer进行前端自动化测试步骤使用示例 如何进行前端自动化测试 前端自动化测试是确保前端应用程序在各种情况下都能正常工作的关键。以下是进行前端自动化测试的一般步骤&#xff1a; 选择适合的测试框架 选…

Vue3+Ant-Design-Vue:报错Cannot read properties of null (reading ‘isCE‘)

问题描述 在使用Ant-Design-Vue内置的Table表格组件&#xff0c;实现expand展开行功能时&#xff0c;报错&#xff1a;Uncaught TypeError: Cannot read properties of null (reading ‘isCE‘) 。 报错信息图示&#xff1a; 在GitHub上找到如下描述&#xff0c; 解决方案 网上…

idea:如何连接数据库

1、在idea中打开database: 2、点击 ‘’ ---> Data Source ---> MySQL 3、输入自己的账号和密码其他空白处可以不填&#xff0c;用户和密码可以在自己的mysql数据库中查看 4、最后选择自己需要用的数据库&#xff0c;点击运用ok&#xff0c;等待刷新即可 最后&#xff1a…

利用numpy库进行数据分析

一.这段代码的主要目的是加载美国和英国的YouTube视频数据&#xff0c;并将它们合并在一起。在这个过程中&#xff0c;我们还添加了一个额外的列来表示数据的来源国家&#xff08;美国或英国&#xff09;。 # codingutf-8 import numpy as np# 定义CSV文件的路径 us_file_path…

JavaI/O流 File类(目录)

目录 File类目录操作实例 File类目录操作 Java的File类提供了对文件和目录进行操作的方法。对于目录&#xff0c;File类提供了以下一些方法&#xff1a; 判断目录是否存在&#xff1a;使用exists()方法可以判断目录是否存在。创建目录&#xff1a;使用mkdir()或mkdirs()方法可…

Java奠基】玩转字符串从基础到高级的操作技巧

目录 初识String StringBuilder StringJoiner 字符串原理 综合练习 初识String java.lang.String 类代表字符串&#xff0c;Java程序中的所有字符串文字(例如“abc”)都为此类的对象&#xff0c;例&#xff1a; String name "张三" 当使用双引号直接赋值时&…

Java语法学习反射

Java语法学习反射 大纲 基本介绍class的介绍 具体案例 1. 基本介绍 流程图&#xff08;程序在计算机的阶段&#xff09; 反射的主要的类 这个提高效率不大 2. class的介绍 对于第三点&#xff1a;首先类只会加载一次&#xff0c;得到的class的对象&#xff0c;也只有一…