设计目的

以前互联网和智能手机不发达的年代,传递个消息可能还要登个什么雅虎,163邮箱去给亲朋好友发个消息传递个文件啥的,还得期望别人上线才能查看到,而现在微信,QQ啥的都支持各种格式的文件传输,随便发个消息那边就能看到,可以说是非常方便了。而邮件系统我看了一下,全网都没多少人愿意去做了,原因是什么?太老旧了!功能太少太落后了!
那么在这个QQ,微信等社交通讯软件横行的时代,为什么我会想到去设计一个二十年前人们常用的邮件系统呢?答案就是安全性!前段时间的学习通盗号事件大家应该都有所耳闻吧。我们的个人信息,包括平常的聊天内容和文件啥的,都是被腾讯的后台数据管理员看的一清二楚的,举个很不恰当的例子,前段时间高考的时候,不就是有一兄弟偷拍了高考原题发QQ群里,没一会就被网警严查了么。不过话又说回来了,现在这个信息时代又有什么隐私可言呢?
激励我去设计这样一个系统的原因主要是因为大学班上有一位同学因为在QQ上点不明链接导致QQ号被盗。导致我们班上其他同学和他的聊天记录,还有他掌管的学校里,班级里的一些私密文件,全部都遭到了泄露。而且说到文件,相信各位都有过QQ下载的文件已过期或者已损坏无法查看而这个文件又是我们迫切所需的这种体验,那可真是欲哭无泪。
基于这样的一个背景,我打算设计一个数据库由自己管理的通讯方式。因为本人能力有限,再加上种种原因,我目前无法设计出一个社交软件,所以我只能暂时设计一个邮件系统,能满足班级里同学的正常聊天和一些机密文件的传输,也当作我的毕业设计了。在具有正常邮件系统所必备的一系列功能的同时,我在后端的代码中还留有一些拓展模块的雏形,以备日后有需求时再进行开发,这部分我会在“未来展望”部分详细叙述。

涉及技术

开发环境: IntelliJ IDEA
数据库:Mysql
核心项目:Tomcat,Maven
后端主要框架:Springboot
前端引擎框架:thymeleaf
系统架构:MVC框架,C/S架构
文本编辑器:Markdown
创新功能算法:RSA加密算法

功能分析

该系统具备以下所述的一系列功能:
注册功能:游客通过输入符合格式的账号,密码以及手机号可以进行注册。
登录功能:已注册的用户可以在登录界面正确输入注册时的账号,密码以及系统随机生成的验证码来进行登录,信息输入错误的用户将无法登录。
找回密码功能:忘记密码的用户可以通过正确输入注册时填写的手机号来进行验证从而重置密码。
修改密码功能:用户成功登录以后,可以修改自己的登陆密码,前提是必须正确输入旧密码,下次登录时需用新密码进行登录。
修改头像功能:用户成功登录以后,可以修改自己的头像,通过选取一张自己设备中的本地图片。该功能的设计目的主要是用来满足用户的个性化需求,方便用户之间区分彼此。
写邮件功能:用户成功登录以后,可以给自己选定的收件人发送邮件,邮件的形式可以选定为纯文本,单附件以及文本附件混合,邮件中的附件来源于自己设备中的本地文件。
发件箱功能:当成功发送邮件后,用户可以在发件箱中查看自己已发送的邮件并查看发送对象是否已读。
邮件撤回功能:用户可以在发件箱中撤回已经发送的邮件。
草稿箱:用户未完成的邮件可以存放在草稿箱中,用户可以在草稿箱中查看并继续编辑当时未完成的邮件。
收件箱功能:当有用户给自己发送邮件时,自己可以在收件箱中查看相应的邮件,如果邮件中有附件,自己作为收件方同样可以进行下载附件操作。
搜索邮件功能:用户可以通过搜索邮件中的关键字来搜索自己收到的或者发出过的邮件。
时间功能:无论是发出的邮件,未发出的邮件还是已接收的邮件,系统中均可以查出该邮件对应的时间。
安全性功能:用户所发送出的邮件和用户的用户名,密码这些私密信息会被系统自动进行加密,即使终端数据库被入侵,用户的隐私也能得到良好的保障。
以上功能包括了一个成型的邮件系统应具有的所有功能及考虑到安全性而设计的附加功能,从用户角度来分析,该系统的功能基本上能满足用户提出的主要需求。


数据库设计

首先,根据系统的功能和需求对系统总体进行分析,系统由用户信息,邮件信息,草稿箱信息和附件信息四个实体构成,四个实体均具有一系列独立的属性。
用户实体:用户在注册时,需要输入自己的账号,密码以及手机号,账号成功注册会记录相应的账号创建时间,系统后台也会给该用户赋予一个id序号,登录成功后还可以根据自己的个性化需求更改自己的头像。由此可见,用户实体具有用户序号,用户名,密码,手机号,创建时间和头像六个属性。
邮件信息实体:用户在发送邮件时,首先需要输入邮件的标题和收件人的地址,其次就是输入正文,当邮件发送成功后,发件人可以查看收件人是否已读该邮件,系统也会记录下该邮件的发送时间。由此可见,邮件实体具有邮件序号,用户名,标题,正文,状态,发送时间和收件人id七个属性。
附件实体:用户发送的邮件,有时候并不是纯文本,更多的用户喜欢通过邮件系统来发送附件,附件自带一个文件名称和自己的url路径,附件的种类也有很多,当附件随着邮件发送成功,系统同样也会记录其发送时间。由此可见,附件实体具有附件序号,附件名称,附件url,附件类型,创建时间五个属性。
草稿箱实体:用户在写邮件时,可以暂时将未发送的邮件储存在草稿箱中,以便下次编辑,该实体与邮件信息实体大致相同。
实体与实体间具有一定的关联。由此可以构建出系统的实体-关系图。

P.S:将草稿箱中邮件信息单独划分成一个实体的原因是,根据实体创建数据库表的时候,系统会通过访问DAO层进行一系列系统后台操作,并且草稿箱中的邮件和已发送的邮件本就应该存储在两个不同的单元中,将草稿箱独立出来不仅可以更好地实现草稿存储操作,也能更方便地进行数据的增删改查。

根据上述ER图,结合实体的属性,可以在数据库中针对四个实体创立四个独立的表,即用户信息表,邮件信息表,附件信息表和草稿箱信息表用以存储各类相关信息。

系统实现

系统首页
运行系统,会自动跳转到系统首页界面,即系统的登录界面。如果是游客可以点击首页上方的注册按钮,即可进入注册界面。
注册模块负责将用户在系统中填写的个人信息存入model类中,再将model类中的数据存入数据库。注册模块的实现步骤大致为:首先注册模块主要负责将用户的详细信息进行存储,主要有用户的账号,密码以及手机号;其次创建一个map集合用以存储一些key—value形式的键值对,如果map集合为空即if (map == null || map.isEmpty()),则注册成功,允许创建账户,如果不为空则会向前端进行报错;然后在用户填写完信息,信息被系统通过访问Dao层写入数据库之后,系统首先将用户信息存为msg数组写入到用户信息表中,然后根据账号创建一系列用户有关的表;最后在用户注册成功后,利用model.addattribute方法在前端通过web层给用户注册成功的信息提示。
注册完成后,在首页输入正确的账号,密码和验证码可以成功登录并进入个人主页。
登录模块主要采用controller层中映射出的@PostMapping(“/login”)作为业务的登录入口,来处理post请求,经过service层,在方法内完成业务处理,大致过程如下:
首先后端得到用户在登录模块输入的账号,密码和系统随机生成的验证码,接着利用@RequestParam将指定的请求参数赋值以验证用户输入的验证码是否正确。错误则提示用户验证码错误,返回登录界面;正确则进入下一步。然后验证用户输入的账号是否存在。若不存在,则提示用户账号不存在,返回登录界面;若存在则进下一步。最后通过Dao层查询用户表中的用户名和密码信息,验证用户输入的密码是否正确。若不正确,则提示用户密码错误,返回登录界面;若正确,则服务器会生成ticket,浏览器通过cookie存储ticket,并提示用户登录成功,进入个人邮箱主页。

在登录界面同样可以根据需要进行找回密码操作,当用户输入手机号,用户名和新密码后,前端将数据进行保存并提交给后台,系统通过Dao层访问用户表并对mobile(手机号)和username(用户名)进行判断,如果与表中的初始数据不一致,则会要求用户重新输入,如果输入正确,则会用用户输入的新密码替换用户表中的旧密码,并提示用户修改成功,下次登录时即需要使用新密码进行登录。

用户首页
当用户正确输入账号,密码和验证码后,即可进入用户首页,界面简洁精炼,包含“收件箱”,“发件箱”,“草稿箱”,“搜索邮件”,“写信”五个主要功能模块,上方点击自己的头像还可以进入“个人主页”模块,“账号设置”模块或者进行“退出登录”操作。
在用户界面创建不同的button事件,利用function来调用不同的功能,分别对应相应的功能,用户只需要单击即可跳转到对应的模块。

个人设置
点击用户界面上方的个人头像,可以选择进入“个人主页”模块,“账号设置”模块或者进行“退出登录”操作。如图5-5所示。
该部分通过对用户首页左上角的用户头像添加了一个button事件,调用click/touch语句,使得用户点击头像能够弹出一个对话框进行相应操作,利用function来调用不同的功能,只需要单击即可跳转到对应的模块,实现相应的功能。

个人主页
点击个人主页按钮,即可进入个人主页,在个人主页中可以查看自己的账号,注册时间,已发送的邮件和已收到的邮件数量。
系统通过引入Date和SimpleDateFormat两个Java包,当用户完成注册操作后,系统会获取当前系统时间和日期并进行格式化输出,即为注册日期。此外系统还创建了两个初始值为0的类用来统计用户发出的邮件和收到的邮件数量,当用户每发送一封邮件或接收到一封邮件,就会给对应的类+1,并且展示给用户。使用户得以实时查看自己账号的相关信息。

修改头像功能
点击“账号设置”按钮,即可进入相应模块,该模块可以实现“修改头像”和“修改密码”功能。
通过插入一个file文件类型的框,使得用户能够单击以进行操作,随后调用浏览器文件选择的插件,访问用户设备中的文件,用户选择相应的文件后,系统获取该文件的url,判断所选文件的类型是否为jpg,gif等基本图片格式,如果不是则会提醒用户重新选择,如果格式符合要求,则会通过访问Dao层,将文件的url存储到用户信息表中,并提示修改成功。每次需要在Web层显示用户头像时,系统就会拿到用户设置头像的真实资源路径,展示给用户。

修改密码功能
同样是在“账号设置”中,可以进行修改密码的功能。当用户输入原密码,新密码和确认密码三个信息后,系统会通过对Dao层的用户表进行查询并对用户输入的原密码进行判断,如果与表中的初始数据不一致,则会要求用户重新输入,如果输入正确,系统会随即判断用户输入的新密码和确认新密码是否一致,如果不一致同样会要求用户重新进行输入,如果一致,则会用用户输入的新密码替换用户表中的旧密码,修改用户表中的相关信息,并提示用户修改成功,下次登录时即需要使用新密码进行登录。

写邮件功能(核心功能)
用户界面上点击“写信”即可进入写邮件界面。该模块采用@PostMapping(“/drafts”)作为入口,使用Markdown编辑器引入相应的文本和内容编辑功能,用户在写邮件的时候需要依次填写邮件主题,收件人,添加附件(非必要)和邮件正文,如果收件人不存在或为自己,系统会提示用户并要求重新输入,如果需要添加附件,则会读取本设备的文件信息,用户可以选择自己想要添加的附件.
当用户选择存为草稿时,系统后端会将这封邮件的相关信息进行保存,加密,导入的操作,并将其存入发送者的草稿箱信息表中,发送者可以在草稿箱中查看到这封邮件并可以随时再次进行编辑。
当用户选择发送邮件时,系统后端同样会将邮件的相关信息进行保存,加密,导入的操作,并将其存入发送者的邮件信息表,在表中添加相应的信息,这样,发送者就可以在自己的发件箱中查到这封邮件。随后,系统将会依据发送者填写的接收者的账号,访问接收者账号的邮件信息表,将这封邮件加入接收者的邮件信息表,接收者即可在自己的收件箱中收到这封邮件,这样一个基本的邮件收发流程就完成了。

草稿箱功能
在邮件界面,编辑一封邮件,然后点击“存为草稿”即可在草稿箱中找到该邮件。整个过程中,系统通过Dao层访问草稿箱信息表,当用户点击存为草稿后,系统就会将用户未完成的邮件添加入草稿箱信息表中,当用户想要对草稿箱中的内容进行编辑的时候,系统则通过Dao层访问并打开草稿箱信息表,查询表中的相应邮件信息呈现给用户并跳转到写邮件界面以方便用户继续对邮件内容进行编辑。

发件箱功能和邮件撤回功能
点击“发送”按钮,将编辑好的邮件进行发送操作,再进入发件箱,可以在其中看到这封邮件并查看该邮件是否已被阅读。用户在点击发送按钮后,刚才的邮件内容会被存入发件人的邮件信息表中,当用户打开发件箱后,系统就会通过访问Dao层查询到已发送的邮件信息并呈现给用户,邮件发送后直至收件人读该邮件期间,邮件信息表中的邮件状态默认为0,即未读。当收件人已读该邮件时,系统则会通过访问Dao层,将邮件信息表中的状态改成1,即已读。相应的,发件人在发件箱中会看到邮件的状态已变更为已读。

点击发件箱中的邮件,可以对该邮件进行撤回功能。原本的收件人将无法看到已被撤回的邮件。当发件人选择撤回已发送的邮件后,系统就会通过访问Dao层,删除邮件信息表中该邮件的相关信息,这样原本的收件人将无法看到这封邮件。

收件箱功能
按照登录操作,登录收件人的账号,即可在收件箱中看到自己收到的邮件。当用户发送一封邮件后,系统就会根据用户所填写的收件人,将这封邮件的信息添加到收件人账号中的邮件信息表中并提示用户有新邮件。点击其中任意一封邮件即可查看内容,下载附件并进行回复,附件通过浏览器自带的视图功能和下载功能进行相应的查看和下载。
整个过程中系统通过Dao层访问收件人的邮件信息表和附件信息表,当收件人点击查看后,系统通过对两个表的相应信息进行查询,将相关信息通过表现层展示给用户,用户可以点击通过附件信息表呈现的附件链接进行附件的下载。

搜索邮件功能
在用户界面的右上方,可以进行搜索邮件功能,在输入框中输入邮件的关键词,即可搜索到相应的邮件,这些邮件可以是收件箱,草稿箱和发件箱中的任何一封,只要包含关键字就会被搜索到。
搜索邮件时,用户通过键入关键词,系统则会根据关键词,通过Dao层访问邮件信息表对表中的数据进行查询,如果查询的这一行数据包含关键词,系统则会将这行数据通过表现层呈现给用户。

信息加密功能(创新功能)
考虑到当今互联网黑客纵行,用户的隐私很容易遭到泄露,所以对邮件系统进行数据加密和保护至关重要。该系统正是对用户所编辑的邮件正文和用户的用户名,密码等信息进行加密,当用户成功注册,或是完成一封邮件的发送或将其存为草稿,系统后台便会运用RSA算法对其进行加密,即使邮件系统的数据库遭到入侵,数据库中的内容也不会泄露。
算法的大致原理为:选择两个较大的素数,记为p和q,将p和q的乘积记为n,接下来,选择一个小的奇数e,在选择e时必须要确保e与(p-1)(q-1)不能有相同因子,然后计算常数d,d的值为e的倒数对(p-1)(q-1)的取模。在计算完e和d后,公钥和私钥即可表示出来。公钥为(e,n),私钥为(d,n)。
在加密的过程中,首先通过PrivateKey privateKey = getPrivateKey(“a.pri”, “RSA”)语句来创建加密对象,接着对加密进行初始化,定义加密模式为使用公钥加密,具体语句为:
Cipher cipher=Cipher.getInstance(“RSA”);
cipher.init(Cipher.ENCRYPT_MODE, privateKey);
byte[] bytes=cipher.doFinal(input.getBytes());
return Base64.encodeBase64String(bytes);
随后,用同样的方法定义解密,由于加密过程使用的是公钥,所以解密就必须用私钥,否则就会出现异常。当解密的方法被成功定义后,通过语句
cipher.init(Cipher.DECRYPT_MODE, publicKey);
byte[] decode=Base64.decodeBase64(encrypted);
byte[] bytes1=cipher.doFinal(decode);
把base64密文转回字节数组,并通过new string()将私钥转为字符串形式。
当定义方法完成后,通过base64编码生成密钥对,将公钥和私钥保存到根目录。经过加
密后,相应数据在数据库中就会显示为乱码。

当加密完成后,如果需要对加密的内容进行解密,则需要对私钥进行读取,利用私钥进行解密。利用String privateKeyString=FileUtils.readFileToString(new File(priPath),Charset.defaultCharset())语句创建key的工厂,运用KeyFactory keyFactory=KeyFactory.getInstance(algorithm)和PKCS8EncodedKeySpec keySpec=new PKCS8EncodedKeySpec(Base64.decodeBase64(privateKeyString));语句创建私钥key的规则并返回私钥。至此,即可完成对加密内容的解密操作,加密部分乱码消失,解密成功。

总结

在设计初期,我针对邮件系统的功能进行了发布问卷调查,调查群体较广,调查基数较大,总体来说调查的参考性较大。针对调查结果,我进行了相应功能的开发,结果较为良好。该系统具有正常邮件系统所必备的基本功能和一些拓展个性化功能的代码雏形,进步空间较大,可以在未来进行进一步的升级与开发,我也期待有大佬联系我与我进行系统的合作。

未来展望

该系统目前仍处在雏形阶段,仅具备正常的收发邮件意义,可以用作小群体间的文件传输,能做到数据的保密。本系统在后端留有部分功能代码的雏形,如数据库超级管理员权限模块,邮件系统中的个性化社交功能等等,以供日后开发。该系统具有未来成长为中小型社交系统的潜质。

本系统纯原创,虽然在界面上可能与许多已成型的邮件系统无法媲美,但算法的复杂度较低,代码的整体难度较低,便于新手学习与了解,也可以用作普通的本科毕业设计,需要源码,论文或者疑难解答的可以私信我或者加V13285202280.

基于Springboot的Java邮件系统的设计与实现(附论文和源码)相关推荐

  1. 基于SpringBoot的Java项目-销售评价系统(附:源码 课件)

    项目背景 我国的中小型企业飞速发展,每年的产品产销量越来越大,汽车产品消费市场也越来越成熟,消费者不仅对产品质量要求越来越高,还对与产品质量关系不大的附属因素的要求也越来越高,在竞争激烈的环境下,在做 ...

  2. 基于java出租车计价器设计与实现(论文+源码)

    毕业设计(论文)任务书 毕业设计(论文)题目:出租车计价器设计与实现毕业设计(论文)要求及原始数据(资料):1.了解并掌握基于java的相关技术,例如JSP.servlet等:2.掌握出租车计价系统的 ...

  3. 基于springboot的智慧养老平台设计与实现-计算机毕业设计源码和LW文档

    摘要 首先,论文一开始便是清楚的论述了系统的研究内容.其次,剖析系统需求分析,弄明白"做什么",分析包括业务分析和业务流程的分析以及用例分析,更进一步明确系统的需求.然后在明白了系 ...

  4. 基于SSM的仓库管理系统的设计与实现(附论文)

    大家好,很高兴和大家分享源码.不管是什么样的需求.都希望各位计算机专业的同学们有一个提高.关于源码如何获取的方式, 大家可以通过常用的搜索引擎,以百度为例,搜索 源码乐园 code51 ,然后再次搜索 ...

  5. 基于springboot地方旅游系统的设计与实现

    摘    要 本次设计内容是基于Springboot的旅游系统的设计与实现,采用B/S三层架构分别是Web表现层.Service业务层.Dao数据访问层,并使用Springboot,MyBatis二大 ...

  6. 基于SpringBoot的房屋租赁管理系统的设计与实现

    基于SpringBoot的房屋租赁管理系统的设计与实现 1 绪论 1.1 课题来源 随着社会的不断发展以及大家生活水平的提高,越来越多的年轻人选择在大城市发展.在大城市发展就意味着要在外面有一处安身的 ...

  7. 基于java基于Web的人事管理系统的设计与实现计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署

    基于java基于Web的人事管理系统的设计与实现计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署 基于java基于Web的人事管理系统的设计与实现计算机毕业设计源码+系统+lw文档+my ...

  8. 基于springboot的家装平台设计与实现

    项目描述 临近学期结束,还是毕业设计,你还在做java程序网络编程,期末作业,老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等.这里根据疫情当下,你 ...

  9. 基于springboot的音乐网站的设计与实现(带论文)

    项目描述 临近学期结束,还是毕业设计,你还在做java程序网络编程,期末作业,老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等.这里根据疫情当下,你 ...

  10. 基于java软式装修设计网站mp4计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署

    基于java软式装修设计网站mp4计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署 基于java软式装修设计网站mp4计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署 本源 ...

最新文章

  1. [luogu3760 TJOI2017] 异或和(树状数组)
  2. TC专访Waymo首席技术官:谷歌自动驾驶的过去和未来
  3. 后台开发必读书籍--Linux 高性能服务器编程
  4. 平衡二叉排序树(完整案例详解及完整C代码实现)
  5. 在sql server数据库的一个表中如何查询共有多少字段
  6. pyemd实现EMD
  7. 向量化编程:arrayfun及cellfun函数的使用
  8. Atitit 常见的bpmn事件类型与触发机制 目录 1. 事件定义概述 2 2. 按照事件的位置分类 2 2.1. 对事件按照位置进行分类,主要可分为开始事件、中间事件和结束事件, 2 3. 按照
  9. VS2015产品激活密钥
  10. TensorFlow2.0 学习笔记(四):迁移学习(MobileNetV2)
  11. intelliJ IDEA 2017 破解方法
  12. java 日语文档翻译_日语文档怎么翻译?一分钟教会你日语翻译
  13. 最近很火的OkHttp剥洋葱系列
  14. 超级减肥王 V4.1.0 iPad版
  15. 有了java基础,迅速学完Python并做了一份笔记-全套Python,建议收藏
  16. 【软工实践】第10组 团队展示(组长)
  17. PPPcloud云主机免费送!
  18. YY 直播GitHub开源项目,霸屏Github排名榜!
  19. html怎么把元素垂直居中显示,分享html css元素垂直居中的几种方法
  20. DZ论坛的几个使用技巧

热门文章

  1. Android MVP架构实现
  2. Linux 命令tar
  3. 华表Cell的网页插件在IE8中无法显示的问题 | #华表Cell #报表 #IE8
  4. 北京小升初混战:有家长给孩子报7个奥数班
  5. 政策评估计量经济学模型(DID)
  6. Avalondock 第一步 创建停靠面板
  7. 盘点2014年邮件行业大事件
  8. 网络安全--通过握手包破解WiFi(详细教程)
  9. ISO 27001信息安全管理体系认证
  10. Android MeasureSpec详解