Vue+SpringBoot打造用户画像活动推荐系统

在这里插入图片描述


目录

  • 一、摘要
    • 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>() {@Overridepublic 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. 必须了解使用本软件的风险,博主不承诺提供一对一的技术支持、使用担保,也不承担任何因本软件而产生的难以预料的问题的相关责任。

在这里插入图片描述

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

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

相关文章

英伟达深夜放王炸|字节跳动游戏之路波折不断|文旅短剧风口将至|25岁QQ魅力不减,5亿人在用|云计算市场疯长152%|电商巨头齐瞄向富足悠闲银发族

新闻一分钟速览 文旅短剧风口将至&#xff0c;一地狂拍十部&#xff0c;影视界看法分歧&#xff0c;悬念丛生&#xff01;字节跳动游戏之路波折不断&#xff0c;能否逆风翻盘引关注。折叠屏手机痛症治愈&#xff0c;实力席卷高端市场&#xff0c;势头强劲&#xff01;雷军豪言…

学习笔记Day12:初探LInux 2

Linux初探 同一个目录中不允许出现文件及文件夹重名 查看文件 cat &#xff08;Concatenate&#xff09;查看文本文件内容&#xff0c;输出到屏幕&#xff08;标准输出流&#xff09; 常用参数 -A打印所有字符&#xff0c;包括特殊字符&#xff08;换行符、制表符等&#xff…

File的学习1

File对象就表示一个路径&#xff0c;可以是文件的路径&#xff0c;也可以是文件夹的路径 这个路径可以是存在的&#xff0c;也可以是不存在的。 package MyFile;import java.io.File;public class FileDemo01 {public static void main(String[] args) {//1.根据文件路径创建…

如何定期清理数据库中的无效数据?

企业的数据库在运行相当长一段时间后&#xff0c;都会出现无效数据的堆积&#xff0c;这些数据包含了过时、重复、错误、缺失&#xff08;空字段&#xff09;的数据&#xff0c;长期占据着宝贵的数据库空间。而在上云热潮的推动下&#xff0c;绝大多数企业已经将他们的业务数据…

fastjson反序列化攻略

漏洞原理 Json.parseObject(json, User.class)方法中&#xff0c;通过指定type的值实现定位某类&#xff0c;会执行User类的构造方法和属性中的get&#xff0c;set方法 判断是否是fastjson/&#xff08;jackson&#xff09; 1.2.24-1.2.83都会有dnslog的payload {"zer…

Java基础-IO流

文章目录 1.文件1.基本介绍2.常用的文件操作1.创建文件的相关构造器和方法代码实例结果 2.获取文件相关信息代码实例结果 3.目录的删除和文件删除代码实例 2.IO流原理及分类IO流原理IO流分类 3.FileInputStream1.类图2.代码实例3.结果 4.FileOutputStream1.类图2.案例代码实例 …

【Flink】Flink 中的时间和窗口之窗口其他API的使用

1. 窗口的其他API简介 对于一个窗口算子而言&#xff0c;窗口分配器和窗口函数是必不可少的。除此之外&#xff0c;Flink 还提供了其他一些可选的 API&#xff0c;可以更加灵活地控制窗口行为。 1.1 触发器&#xff08;Trigger&#xff09; 触发器主要是用来控制窗口什么时候…

【大模型系列】统一图文理解与生成(BLIP/BLIPv2/InstructBLIP)

文章目录 1 BLIP(2022, Salesforce Research)1.1 简介1.2 数据角度1.3 模型角度1.4 BLIP预训练的目标 2 BLIP2(ICML2023, Salesforce)2.1 简介2.2 模型架构2.3 训练细节 3 InstructBLIP(2023, Salesforce)3.1 指令微调技术(Instruction-tuning)3.2 数据集准备3.3 Instruction-a…

docker入门(二)—— docker三大概念(镜像、容器、仓库)

docker 的三大必要概念 docker 的三大必要概念——镜像、容器、仓库 docker 架构图 镜像&#xff08;image&#xff09;&#xff1a;模版。&#xff08;web项目&#xff1a;1、环境 2、配置变量 3、上线项目 4、配置项目需要的静态文件&#xff09;打包成镜像 docker 镜像&a…

代码随想录阅读笔记-哈希表【两个数组的交集】

题目 给定两个数组&#xff0c;编写一个函数来计算它们的交集。 说明&#xff1a; 输出结果中的每个元素一定是唯一的。 我们可以不考虑输出结果的顺序。 提示&#xff1a; 1 < nums1.length, nums2.length < 10000 < nums1[i], nums2[i] < 1000 思路 交集&…

【源码阅读】EVMⅢ

参考[link](https://blog.csdn.net/weixin_43563956/article/details/127725385 大致流程如下&#xff1a; 编写合约 > 生成abi > 解析abi得出指令集 > 指令通过opcode来映射成操作码集 > 生成一个operation 以太坊虚拟机的工作流程&#xff1a; 由solidity语言编…

鸿蒙实战开发:【FaultLoggerd组件】讲解

简介 Faultloggerd部件是OpenHarmony中C/C运行时崩溃临时日志的生成及管理模块。面向基于 Rust 开发的部件&#xff0c;Faultloggerd 提供了Rust Panic故障日志生成能力。系统开发者可以在预设的路径下找到故障日志&#xff0c;定位相关问题。 架构 Native InnerKits 接口 Si…

Linux操作系统——多线程

1.线程特性 1.1线程优点 创建一个新线程的代价要比创建一个新进程小得多与进程之间的切换相比&#xff0c;线程之间的切换需要操作系统做的工作要少很多线程占用的资源要比进程少很多能充分利用多处理器的可并行数量在等待慢速I/O操作结束的同时&#xff0c;程序可执行其他的计…

《1w实盘and大盘基金预测 day7》

昨日预测有点差劲&#xff0c;最低点也相差五个点。 打分C 公众号&#xff1a;JavaHelmet 昨天预测&#xff1a; 3052-3062-3076-3115 3067是趋势线&#xff0c;有回踩需求 5-30-60分钟级别顶钝 大盘冲到标红的点位3115或者3100就需注意。不要随意追高&#xff08;最高309…

备战蓝桥杯---牛客寒假训练营2VP

题挺好的&#xff0c;收获了许多 1.暴力枚举&#xff08;许多巧妙地处理细节方法&#xff09; n是1--9,于是我们可以直接暴力&#xff0c;对于1注意特判开头0但N&#xff01;1&#xff0c;对于情报4&#xff0c;我们可以把a,b,c,d的所有取值枚举一遍&#xff0c;那么如何判断有…

ModbusTCP转Profinet网关高低字节交换切换

背景&#xff1a;在现场设备与设备通迅之间通常涉及到从一种字节序&#xff08;大端或小端&#xff09;转换到另一种字节序。大端字节序是指高位字节存储在高地址处&#xff0c;而小端字节序是指低位字节存储在低地址处。在不动原有程序而又不想或不能添加程序下可选用ModbusTC…

OCP NVME SSD规范解读-13.Self-test自检要求

4.10节Device Self-test Requirements详细描述了数据中心NVMe SSD自检的要求&#xff0c;这一部分规范了设备自身进行各种健康检查和故障检测的过程。自检对于确保SSD的正常运行和提前预防潜在故障至关重要。 在进行设备自检时&#xff0c;设备应当确保不对用户数据造成破坏&am…

【人工智能】Gitee AI 天数智芯有奖体验开源AI模型,一定能有所收货,快来体验吧

大家好&#xff0c;我是全栈小5&#xff0c;欢迎阅读小5的系列文章。 这是《人工智能》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 目录 前言两大赛道天数智芯1.模型地址2.天数智芯专区3.选择模型4.模型详情页5.部署模型6.成功部署7.执行例子8.移除模型 千模盲…

03python注释与输入函数

Python 注释的作用: 注释可用于解释 Python 代码。 注释可用于提高代码的可读性。 在测试代码时,可以使用注释来阻止执行。 注释可以放在一行的末尾,Python 将忽略该行的其余部分: 实例1 print("Hello, World!") #打印输出Hello,World print(9-3) #输出9…

【mybatis】objectwrapper解读

简介 在 MyBatis 中&#xff0c;ObjectWrapper 是一个关键的接口&#xff0c;用于详细封装了对象的属性信息。ObjectWrapper 主要用于内部操作&#xff0c;它抽象了对象的属性操作&#xff0c;使得 MyBatis 能够统一处理原生类型、Bean 对象以及 Map 集合等。 类图展示 主要功…