【开源】SpringBoot框架开发不良邮件过滤系统

news2024/11/28 6:40:44

在这里插入图片描述


目录

  • 一、摘要
    • 1.1 项目介绍
    • 1.2 项目录屏
  • 二、功能模块
    • 2.1 系统用户模块
    • 2.2 收件箱模块
    • 2.3 发件箱模块
    • 2.4 垃圾箱模块
    • 2.5 回收站模块
    • 2.6 邮箱过滤设置模块
  • 三、实体类设计
    • 3.1 系统用户
    • 3.2 邮件
    • 3.3 其他实体
  • 四、系统展示
  • 五、核心代码
    • 5.1 查询收件箱档案
    • 5.2 查询回收站档案
    • 5.3 新增邮件的附件
    • 5.4 新增白名单档案
    • 5.5 增改黑名单档案
  • 六、免责说明


一、摘要

1.1 项目介绍

基于JAVA+Vue+SpringBoot+MySQL的不良邮件过滤系统,包含了发件箱、收件箱、垃圾箱、回收站、黑名单、白名单和关键词过滤模块,还包含系统自带的用户管理、班级管理、角色管理、菜单管理、日志管理、数据字典管理、文件管理、图表展示等基础模块,不良邮件过滤系统基于角色的访问控制,给邮件管理员、普通用户使用,可将权限精确到按钮级别,您可以自定义角色并分配权限,系统适合设计精确的权限约束需求。

1.2 项目录屏


二、功能模块

在这里插入图片描述

2.1 系统用户模块

系统用户模块包含了系统登陆用户的档案维护。我们需要建立一个档案来维护用户,包括用户的邮箱地址、发信人名字、手机号、身份证、权限等数据。

在这里插入图片描述

2.2 收件箱模块

收件箱模块包含了系统用户正常收到的所有邮件,用户可以在此模块中查询自己收到的电子邮件。

在这里插入图片描述

2.3 发件箱模块

发件箱模块包含了电子邮件的发送界面,还包括了系统用户历史发送的邮件档案,和未发出的草稿邮件信息。

在这里插入图片描述

2.4 垃圾箱模块

垃圾箱模块包含了系统用户收到的垃圾信息。这些邮件是被用户设置的过滤规则所过滤的邮件档案,用户可以在垃圾箱模块中查询它们。

在这里插入图片描述

2.5 回收站模块

系统用户可以主动删除收到的邮件,用户操作删除后,邮件会自动进入到回收站作为缓冲区。用户如果在可以在回收站再次删除文件,即彻底删除邮件信息。

在这里插入图片描述

2.6 邮箱过滤设置模块

系统用户可以自定义配置适合自己的过滤规则,如设置黑名单防止骚扰,设置白名单避免误伤,设置关键词以便更精确的过滤邮件。

在这里插入图片描述


三、实体类设计

3.1 系统用户

系统用户登录模块管理邮件系统的登录帐户,用户信息包括帐号、性别、手机号码、生日、身份证号码、电子邮件、注册日期、备注等其中,账号是系统用户的决定因素。

在这里插入图片描述

3.2 邮件

发件箱、收件箱、垃圾箱、回收站模块分别是对邮件进行记录并管理,其中邮件的信息包括了邮件的邮件ID、发件人ID、发件人姓名、收件人ID、收件人姓名、邮件标题、邮件内容、附件、备注等,其中邮件ID是邮件的确定性因素。
在这里插入图片描述

3.3 其他实体

黑名单表,用于存储系统用户的黑名单数据,包括的拉黑的规则名称、邮箱地址、生效用户ID和备注信息。
白名单表,用于存储系统用户的白名单数据,包括的拉白的规则名称、邮箱地址、生效用户ID和备注信息。
关键词表,用于存储系统用户的配置的过滤关键词,包括的关键词、生效用户ID这两个字段。


四、系统展示

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


五、核心代码

5.1 查询收件箱档案

@RequestMapping(value = "/getByShouPage", method = RequestMethod.GET)
@ApiOperation(value = "查询收件箱档案")
public Result<IPage<MailArchives>> getByShouPage(@ModelAttribute MailArchives mailArchives ,@ModelAttribute PageVo page){
    User currUser = securityUtil.getCurrUser();
    QueryWrapper<MailArchives> qw = new QueryWrapper<>();
    qw.eq("to_id",currUser.getId());
    if(!ZwzNullUtils.isNull(mailArchives.getFromUser())) {
        qw.like("from_user",mailArchives.getFromUser());
    }
    if(mailArchives.getStatus() > 0) {
        qw.eq("status",mailArchives.getStatus() - 1);
    }
    qw.ne("status",3);
    IPage<MailArchives> data = iMailArchivesService.page(PageUtil.initMpPage(page),qw);
    return new ResultUtil<IPage<MailArchives>>().setData(data);
}

5.2 查询回收站档案

@RequestMapping(value = "/getByLaJiPage", method = RequestMethod.GET)
@ApiOperation(value = "查询回收站档案")
public Result<IPage<MailArchives>> getByLaJiPage(@ModelAttribute MailArchives mailArchives ,@ModelAttribute PageVo page){
    User currUser = securityUtil.getCurrUser();
    QueryWrapper<MailArchives> qw = new QueryWrapper<>();
    qw.eq("to_id",currUser.getId());
    if(!ZwzNullUtils.isNull(mailArchives.getFromUser())) {
        qw.like("from_user",mailArchives.getFromUser());
    }
    qw.eq("status",3);
    IPage<MailArchives> data = iMailArchivesService.page(PageUtil.initMpPage(page),qw);
    return new ResultUtil<IPage<MailArchives>>().setData(data);
}

5.3 新增邮件的附件

@RequestMapping(value = "/addFile", method = RequestMethod.GET)
@ApiOperation(value = "新增邮件的附件")
public Result<Object> addFile(@RequestParam String mailId,@RequestParam String fileId){
    String[] fileSplit = fileId.split("/");
    File file = iFileService.getById(fileSplit[fileSplit.length - 1]);
    if(file == null) {
        return ResultUtil.error("附件文件不存在");
    }
    MailArchives mailArchives = iMailArchivesService.getById(mailId);
    if(mailArchives == null) {
        return ResultUtil.error("邮件不存在");
    }
    MailFile mailFile = new MailFile();
    mailFile.setFileId(fileId);
    mailFile.setMailId(mailId);
    mailFile.setFileSize(file.getSize());
    mailFile.setTitle(file.getName());
    iMailFileService.saveOrUpdate(mailFile);
    return ResultUtil.success();
}

5.4 新增白名单档案

@RequestMapping(value = "/insert", method = RequestMethod.POST)
@ApiOperation(value = "新增白名单档案")
public Result<Whitelist> insert(Whitelist whitelist){
    if(ZwzNullUtils.isNull(whitelist.getMailAddress())) {
        return ResultUtil.error("白名单邮箱不能为空");
    }
    QueryWrapper<User> userQw = new QueryWrapper<>();
    userQw.eq("email",whitelist.getMailAddress());
    User findUser = iUserService.getOne(userQw);
    if(findUser == null) {
        return ResultUtil.error("非系统用户邮箱");
    }
    whitelist.setMailId(findUser.getId());
    User currUser = securityUtil.getCurrUser();
    whitelist.setUserId(currUser.getId());
    iWhitelistService.saveOrUpdate(whitelist);
    return new ResultUtil<Whitelist>().setData(whitelist);
}

5.5 增改黑名单档案

@RequestMapping(value = "/insert", method = RequestMethod.POST)
@ApiOperation(value = "新增黑名单档案")
public Result<Blacklist> insert(Blacklist blacklist){
    if(ZwzNullUtils.isNull(blacklist.getMailAddress())) {
        return ResultUtil.error("黑名单邮箱不能为空");
    }
    QueryWrapper<User> userQw = new QueryWrapper<>();
    userQw.eq("email",blacklist.getMailAddress());
    User findUser = iUserService.getOne(userQw);
    if(findUser == null) {
        return ResultUtil.error("非系统用户邮箱");
    }
    blacklist.setMailId(findUser.getId());
    User currUser = securityUtil.getCurrUser();
    blacklist.setUserId(currUser.getId());
    iBlacklistService.saveOrUpdate(blacklist);
    return new ResultUtil<Blacklist>().setData(blacklist);
}

六、免责说明

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

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

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

在这里插入图片描述

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

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

相关文章

玩转C语言——深入理解指针

一、指针概念 1.1 内存和地址 在开始学习指针前&#xff0c;我们先来讲一个例子&#xff0c;假如你身处一栋楼中&#xff0c;你点了一份外卖&#xff0c;那么&#xff0c;外卖员如何能找到你&#xff1f;有两种方法。法一&#xff1a;直接一间一间找&#xff0c;这样做不仅消耗…

数据结构(三)复杂度的深层次剖析

之前发布了数据结构&#xff08;一&#xff09;&#xff0c;很多同学反响不够清晰&#xff0c;那今天就发一篇对复杂度专题的博客&#xff0c;希望对大家理解复杂度提供一些帮助。 时间复杂度 我们先来一个理解一个复杂度&#xff0c;二分查找的复杂度&#xff08;之前写过二…

JSONP 实现跨域请求案例

后端使用 express 搭建&#xff0c;案例代码如下&#xff1a; const express require(express)const app express() const PORT 3000app.get(/data, (req, res) > {const jsonData {name: Alan,age: 666,city: GD}const callback req.query.callback // 获取前端中的回…

野火ESP8266模块开发-基于Arduino IDE

一、野火ESP8266模块介绍 ESP8266 拥有高性能无线 SOC&#xff0c;给移动平台设计师带来福音&#xff0c;它以最低成本提供最大实用性&#xff0c;为 WiFi 功能嵌入其他系统提供无限可能。ESP8266 是一个完整且自成体系的 WiFi 网络解决方案&#xff0c;能够独立运行&#xff0…

网络工程师之路由交换技术篇

网络工程师之路由交换技术篇 路由交换之技术篇ARPICMPBPDUIPv6IP编址MAC其他技术点参考 以下均为个人笔记&#xff0c;摘录到csdn做备份 路由交换之技术篇 ARP Operation Code指定了ARP报文的类型&#xff0c; 包括ARP request 和ARP reply&#xff1b;取值为1或者2 &#x…

计算机毕业设计-基于深度学习的验证码识别方法设计与实现

概要 验证码是一个系统区分人类与非人类行为的有效方式。验证码识别技术能够使计算机程序输入正确的验证码&#xff0c;伪装成人类用户进入目标系统。另一方面&#xff0c;系统方面需要考虑破解验证码识别技术&#xff0c;修补验证方式的可能漏洞&#xff0c;使之能够更有效地区…

返回a除以b的余数 operator.mod(a, b) 返回a的b次幂 operator.pow(a, b)

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 返回a除以b的余数 operator.mod(a, b) 返回a的b次幂 operator.pow(a, b) [太阳]选择题 请问以下程序中operator.pow(2, 3)的执行结果是&#xff1a; import operator print("【执行】ope…

springboot284基于HTML5的问卷调查系统的设计与实现

问卷调查系统的设计与实现 摘 要 传统信息的管理大部分依赖于管理人员的手工登记与管理&#xff0c;然而&#xff0c;随着近些年信息技术的迅猛发展&#xff0c;让许多比较老套的信息管理模式进行了更新迭代&#xff0c;问卷信息因为其管理内容繁杂&#xff0c;管理数量繁多导…

【vue核心技术实战精讲】1.1 Vue开篇介绍 + 1.2 Vue的起步 和 插值表达式

文章目录 准备开始适应人群vue 框架学习路线一、vue 基础1、历史介绍2、前端框架与库的区别? 二、vue的起步 和 插值表达式Stage 1&#xff1a;下载包&#xff0c;并放入项目中Stage 2&#xff1a;编码 准备开始 适应人群 有一定的HTML/CSS/JavaScriptES6基础开发人员 vue …

深入解析MySQL数据库锁机制

✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天开心哦&#xff01;✨✨ &#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; ✨✨ 帅哥美女们&#xff0c;我们共同加油&#xff01;一起进步&am…

基于springboot+vue的光影视频网站

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

【机器学习智能硬件开发全解】(九)—— 政安晨:通过ARM-Linux掌握基本技能【C语言程序的预处理过程】

政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: 机器学习智能硬件开发全解 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff01; C语言程序的预处理过程是在编译阶段之前进行的&#x…

基础-笔试题6

1、tcp/udp是属于哪一层&#xff1f;tcp/udp有何优缺点&#xff1f; tcp /udp属于运输层 TCP 服务提供了数据流传输、可靠性、有效流控制、全双工操作和多路复用技术等。 与 TCP 不同&#xff0c; UDP 并不提供对 IP 协议的可靠机制、流控制以及错误恢复功能等。由于 UDP 比较…

[Qt学习笔记]Qt鼠标事件mouseMoveEvent实时获取图像的坐标和像素值

目录 1、介绍2、效果展示3、实现过程3.1 图像的加载和显示3.2 设置鼠标跟踪事件激活3.3 实现代码 4、源码展示 1、介绍 上一篇介绍了使用OpenCV的setMouseCallback回调函数实现获取鼠标点击点的图像坐标和像素值&#xff0c;本篇使用鼠标事件mouseMoveEvent函数来实现实时获取…

vue3+element Plus form 作为子组件,从父组件如何赋值?

刚开始接触vue3时&#xff0c;碰到一个很low的问题&#xff0c;将form作为子组件&#xff0c;在页面中给form表单项输入内容&#xff0c;输入框不显示值&#xff0c;知道问题出在哪&#xff0c;但因为vue3组合式api不熟悉&#xff0c;不知从哪下手... 效果图&#xff1a; 父组…

如何在iOS系统抓取log

前言&#xff1a;因为作者目前工作领域和苹果智能家居有关&#xff0c;然后发现一些bug其实是apple sdk原生code的问题&#xff0c;所以需要给apple提radar单&#xff0c;就需要抓ios端Log充当证据给apple看&#xff0c;其实ios抓log非常简单&#xff0c;大家感兴趣可以学习下哦…

Python条件语句深度解析:从基础到应用的全面指南

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 &#x1f4dd; 个人网站 :《 江城开朗的豌豆&#x1fadb; 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! ​ 目录 &#x1f4d8; 一、引言 &#x1f4dd; 二、…

【Flutter】导航组件 NavigationRail 的用法简介

​​Material Design 3 定义了三种导航模式&#xff0c;其用法和对应的 Flutter 组件如下所示&#xff1a; MD3 导航Flutter 组件用途Navigation barBottomNavigationBar小型屏&#xff08;宽度小于640&#xff09;Navigation drawerDrawer大型屏&#xff08;宽度大于960&…

Java基础 学习笔记四

标识符 标识符是在源代码中程序员自己有权利命名的单词标识符可以标识 变量名&#xff0c;方法名&#xff0c;类名 标识符命名规则 标识符只能由数字&#xff0c;字符&#xff08;java支持所有国家语言&#xff09;&#xff0c;_&#xff0c; $ 组成&#xff0c;不能含有其他…

基于树莓派实现 --- 智能家居

最效果展示 演示视频链接&#xff1a;基于树莓派实现的智能家居_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1Tr421n7BM/?spm_id_from333.999.0.0 &#xff08;PS&#xff1a;房屋模型的搭建是靠纸板箱和淘宝买的家居模型&#xff0c;户型参考了留学时短租的公寓~&a…