课程设计报告
目录
1 摘要
在现代世界,随着计算机和互联网的普及,电子邮件已成为仅次于语音的第二大常用通信渠道。在企业内部,员工之间交流的邮件内容包括市场分析、项目管理、采购信息、客户投诉、内部备忘录甚至协议等重要信息。
目前,由于电子邮件仍然是一种点对点的传输方式,大量有用的信息,即知识,无法被企业中的其他人有效利用。知识管理是指创造、获取和使用知识以提高组织绩效的过程。为解决企业邮件管理问题,本文构建了一个基于邮件的管理系统。系统分为六个模块:用户模块、收件模块、发件模块、删除模块、敏感字符过滤模块、回收模块。系统实现的功能主要包括:用户以及管理员的登陆注册,邮件的收发、回收和记录。系统提供系统管理员、普通用户二种主要角色,是一个功能齐全、操作简单、使用方便的基于电子邮件的管理系统。
此邮件管理系统主要使用到MVC架构、Mysql数据库、java、jsp等技术,并使用idea提供的环境进行灵活的搭建,极大地减小了开发难度。
关键词:邮件管理系统; idea; MVC; mysql;jsp
2 需求分析
2.1功能模块需求分析
2.1.1 登录注册模块。
用户登录:主要功能是用户点击登录按钮后输入用户名和密码与数据库中的信息进行验证。登 录成功后可以修改个人密码以及个人资料,管理员还可以对其进行修改访问。
用户注册:主要功能是用户点击注册按钮之后,进入用户注册信息页面,填写个人信息后写入数据库中,以便下次登录使用。
2.1.2 邮件收发:包括写邮件、收邮件、发送邮件。
写邮件:对要发的邮件进行编辑,包括主题,内容等,可以添加附件等。
发送邮件:邮件编辑好之后有保存按钮和发送按钮,之后进行发送。
收邮件:接收邮件并进行垃圾邮件的过滤。
2.1.3 邮箱管理:包括收件箱,草稿箱,发件箱和垃圾箱。
收件箱:里面可以查看到所有接收到的邮件,并可以点击进去进行查看,删除等操作
草稿箱:用户在编辑完邮件之后,可以点击保存在草稿箱以便后续操作。
发件箱:用户对之前发送出去的邮件进行查看和修改,以及再次发送和删除。
垃圾箱:这里包括了用户删除的所有邮件,可以还原或者彻底的删除。
2.1.4 通讯录模块:包括建立通讯录、查看通讯录和删除通讯录。
新建通讯录:用户通过新建通讯录可以对联系人进行分类等操作
查看通讯录:可以查看通讯录中的所有联系人,并进行移动,删除等操作。
2.2 整体需求分析
邮箱管理系统在实现上述的功能需求之外,还要有良好的可扩展性和高可靠性,可扩展性是衡量系统是否成功的一个重要标志,本方案从硬件平台可扩展性和软件功能模块的可扩展性俩个方面来满足需求。高可靠是邮件系统最基本也是最重要的一个需求。
3 数据库结构设计
3.1 数据描述与实体关系模型
3.1.1 邮件系统有关实体及属性为:
(1). 用户:用户 ID、用户名、账号密码;
(2). 邮件:已读标记、删除标记、邮件编号、邮件主题、收件人 ID、收件人用
户名、发件人 ID、发件人用户名、邮件内容、发送时间、附件编号;
(3). 附件:附件名、附件编号、所属邮件编号、附件内容;
(4). 草稿:草稿编号、草稿主题、草稿内容、编辑时间、编写人 ID、编写人用
户名;
- . 通讯录:联系人 ID、联系人用户名、联系人备注。
3.1.2 E-R图
3.2 数据库整体图览
3.3数据库表设计
- user表(用户信息表):
字段名称 | 数据类型 | 长度 | 可否为空 | 说明 |
User_id | Int | (11) | 主键 | 用户编号 |
User_name | varchar | (50) | NOT NULL | 用户名 |
User_pw | varchar | (50) | NOT NULL | 密码 |
User_realname | varchar | (50) | NOT NULL | 真实姓名 |
User_address | varchar | (50) | NULL | 住址 |
User_sex | varchar | (50) | NOT NULL | 性别 |
User_tel | varchar | (50) | NULL | 联系电话 |
- admin表(管理员信息表):
字段名称 | 数据类型 | 长度 | 可否为空 | 说明 |
userId | Int | (11) | 主键 | 管理员编号 |
userName | varchar | (50) | NOT NULL | 管理员用户名 |
userPw | varchar | (50) | NOT NULL | 登录密码 |
- shoujianxiang表(收件箱表):
字段名称 | 数据类型 | 长度 | 可否为空 | 说明 |
Email_id | int | (11) | 主键 | 邮件编号 |
Email_title | varchar | (50) | NOT NULL | 邮件标题 |
Email_content | varchar | (50) | NOT NULL | 邮件内容 |
Email_fujian | varchar | (50) | NULL | 附件路径 |
Email_fujianyuanshiming | varchar | (50) | NULL | 附件文件名 |
Email_date | varchar | (50) | NOT NULL | 邮件时间 |
From_user_name | varchar | (255) | NOT NULL | 发邮件用户名 |
To_user_Name | varchar | (255) | NOT NULL | 收邮件用户名 |
- fajianxiang表(发件箱表):
字段名称 | 数据类型 | 长度 | 可否为空 | 说明 |
Email_id | int | (11) | 主键 | 邮件编号 |
Email_title | varchar | (50) | NOT NULL | 邮件标题 |
Email_content | varchar | (50) | NOT NULL | 邮件内容 |
Email_fujian | varchar | (50) | NULL | 附件路径 |
Email_fujianyuanshiming | varchar | (50) | NULL | 附件文件名 |
Email_date | varchar | (50) | NOT NULL | 邮件时间 |
From_user_name | varchar | (50) | NOT NULL | 发邮件用户名 |
To_user_Name | varchar | (50) | NOT NULL | 收邮件用户名 |
- caogaoxiang表(草稿箱表):
字段名称 | 数据类型 | 长度 | 可否为空 | 说明 |
Email_id | int | (11) | 主键 | 邮件编号 |
Email_title | varchar | (50) | NOT NULL | 邮件标题 |
Email_content | varchar | (50) | NOT NULL | 邮件内容 |
Email_fujian | varchar | (50) | NULL | 附件路径 |
Email_fujianyuanshiming | varchar | (50) | NULL | 附件文件名 |
Email_date | varchar | (50) | NOT NULL | 邮件时间 |
From_user_name | varchar | (50) | NOT NULL | 发邮件用户名 |
To_user_Name | varchar | (50) | NOT NULL | 收邮件用户名 |
- lajixiang表(垃圾箱表):
字段名称 | 数据类型 | 长度 | 可否为空 | 说明 |
Email_id | int | (11) | 主键 | 邮件编号 |
Email_title | varchar | (50) | NOT NULL | 邮件标题 |
Email_content | varchar | (50) | NOT NULL | 邮件内容 |
Email_fujian | varchar | (50) | NULL | 附件路径 |
Email_fujianyuanshiming | varchar | (50) | NULL | 附件文件名 |
Email_date | varchar | (50) | NOT NULL | 邮件时间 |
From_user_name | varchar | (50) | NOT NULL | 发邮件用户名 |
To_user_Name | varchar | (50) | NOT NULL | 收邮件用户名 |
- tongxunlu表(通讯录信息表):
字段名称 | 数据类型 | 长度 | 可否为空 | 说明 |
id | int | (11) | 主键 | 编号 |
name | varchar | (50) | NULL | 联系人姓名 |
sex | varchar | (50) | NOT NULL | 联系人性别 |
age | varchar | (50) | NULL | 联系人年龄 |
tel | varchar | (50) | NULL | 联系人电话 |
address | varchar | (50) | NULL | 联系人地址 |
gongsi | varchar | (50) | NULL | 联系人公司 |
emaiadd | varchar | (50) | NOT NULL | 联系人邮箱地址 |
User_Id | int | (11) | NOT NULL | 使用通讯录的用户ID |
4 程序结构框图
本系统所设计用户权限分为两类:管理员,用户。普通用户可以在系统中收发邮件以及管理邮箱的操作。管理员除了可以收发邮件的功能操作外,还可以进行对用户信息进行管理功能。
管理员的具体操作如下图:
图1 管理员使用系统功能模块图
用户的具体操作如下图:
图2 普通用户使用系统功能模块图
5 程序功能说明
- 登录管理模块:
对用户身份进行验证以及权限的设置等。本模块分二个子模块,用户登录模块的功能是使用本系统上用户名和密码登录;修改密码模块的功能是通过先验证用户原密码然后修改成新密码。
- 邮件收发模块:
对用户的邮件收发进行详细的管理。本模块分为三个子模块,写邮件模块的功能是用来录入邮件的内容;收邮件模块的功能是用来接收、过滤并分类邮件信息;发送邮件模块的功能包括操作方式(发送和保存到草稿箱)和存储邮件。
- 邮箱管理模块:
是对邮箱中的邮件信息进行详细的管理。本模块分为四个子模块,收件箱的功能是用来查看和删除邮件;发件箱模块的功能是用来存储用户发送过的邮件信息;草稿箱模块的功能是实现对保存的邮件进行编辑和删除;垃圾箱模块的功能是用来存放垃圾邮件和用户删除的邮件。
- 通讯录管理模块:
是对所有联系人的信息管理。本模块分为三个子模块,新建通讯录模块的功能是联系人信息;查看通讯录模块的功能是列出所有联系人的信息进行查看和删除;删除通讯录模块的功能是删除单个联系人的操作;邮件群发是在通讯录列表中选择指定 联系人群发邮件。
6 系统实现界面
6.1登录管理模块
6.1.1登录模块设计实现
管理员、用户登录的界面中,包括用户名和密码得输入文本框,以及提交登录按钮和重写按钮。管理员登录界面如图6-1所示。
图6-1登录界面
在执行登录时,页面supermail_1_2_war_exploded/index.jsp调UserLoginServlet.java文件中的方法对所填写的信息进行接收,并通过select语句查询user表或admin表,对管理员或用户的登录信息进行验证。
6.1.2管理员模块设计实现
用户的信息需要由系统管理员来进行管理和维护。注册用户列表页面设计如图所示。
管理员查看用户列表的页面代码源文件为supermail_1_2_war_exploded/show.jsp,这个页面主要是执行表user的select查询语句,查得的结果是多行记录,通过User的UserAllServlet()方法查询出所有的记录,保存在list类型变量userlist中再传回JSP页面输出。删除用户通过User的UserDel()方法执行。
6.2邮箱管理模块
6.2.1用户撰写和发送邮件设计实现
用户登录后,主要的工作就是对邮件的管理,界面设计的结果如图6-2所示。
图6-2 用户撰写邮件界面
用户登录系统之后,就可以使用邮件管理的功能,首先是撰写邮件,然后是发送邮件。发送邮件的代码所做的工作主要如下:
(1)检验所填数据或者信息的合法性,如必须填写的信息是否填写、所填写的信息是否按照要求填写等。
(2)检查收件人在系统中是否存在,即检验收件人的合法性。
(3)根据是保存还是发送,对数据库进行操作。如果是保存,则把所编写的邮件保存在发件箱中;如果是发送,则可在已发邮件找到所发送的邮件。
6.2.2用户邮箱管理设计实现
用户收件箱管理界面设计如图6-3所示。
图6-3 收件箱界面
用户在撰写邮件特别是撰写到一半时,可以先单击“保存”按钮保存到草稿箱中等待以后处理,在草稿箱中可以查看没有发送的邮件。这个页面的源代码文件为caogaoxiang.jsp
6.3.1联系人设计实现
图6-4 查看通讯录界面
6.3.2邮件群发设计实现
邮件群发功能的设计和普通发送邮件一样,只是可以多个选择联系人,选择多个联系人之后,点击写邮件,在邮件编写完成后点击提交按钮,群发邮件便可发送成功。群发的页面如图6-5所示。
图6-5群发邮件编辑界面
6.3.3通讯录人员删除实现
邮件联系人的删除功能在点击删除按钮后会出现一个弹框,提示是否要删除,点击确定便可删除,若想要一次删除多个联系人,点击复选框,多选即可。
图6-5联系人删除界面
6.4主要实现代码
6.4.1 数据库连接代码(主要实现对MySQL数据库连接--jdbc)
package com.util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class ConnUtil {
public static Connection getConn() {
Connection conn = null;
try {
//1.加载驱动
Class.forName("com.mysql.jdbc.Driver");
//2.连接数据库
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mail?useUnicode=true&characterEncoding=utf-8","root", "123456");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
}
6.4.2 数据库操作代码(主要实现对MySQL数据库的增删改查)
package com.util;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class BaseDao {
//增删改
//SQL语句
public int modifyData(String sql,Object [] obj) {
Connection conn = ConnUtil.getConn();
int result = 0;
try {
PreparedStatement ps = conn.prepareStatement(sql);
for (int i = 0; i < obj.length; i++) {
ps.setObject(i+1,obj[i]);
}
//执行
result = ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
return result;
}
//查询
public ResultSet getDataByANY(String sql,Object [] obj) {
Connection conn = ConnUtil.getConn();
ResultSet rs=null;
try {
PreparedStatement ps = conn.prepareStatement(sql);
for (int i = 0; i < obj.length; i++) {
ps.setObject(i+1,obj[i]);
}
rs = ps.executeQuery();
} catch (SQLException e) {
e.printStackTrace();
}
return rs;
}
}
6.4.3主页代码(index.jsp)
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%--<!DOCTYPE html>--%>
<%
//这里定义一个用于获取本项目根路径的一个地址
String path = request.getContextPath();
%>
<html>
<head>
<link rel="stylesheet" type="text/css" href="css/reset.css" />
<link rel="stylesheet" type="text/css" href="css/index.css" />
<title>supermail</title>
</head>
<%--注册点击事件--%>
<script type="text/javascript">
function gotoReg(){
location.href="modify.jsp"
}
</script>
<body id="bigBox">
<h1>Welcome to SUPERMAIL</h1>
<br/>
<div class="inputBox" style="align-content: center">
<form action="<%=path%>/UserLoginServlet">
<div class="inputText">
用户名:<input type="text" name="User_name"><br/>
密 码:<input type="password" name="User_pw"><br/>
</div>
<input class="inputButton" type="submit" value="登录">
<input class="inputButton" type="button" value="注册" onclick="gotoReg()">
</form>
</div>
</body>
</html>
6.4.4 修改页面代码(modify.jsp)
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
String path = request.getContextPath();
%>
<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2022/5/20
Time: 15:48
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java"%>
<html>
<head>
<link rel="stylesheet" type="text/css" href="css/reset.css" />
<link rel="stylesheet" type="text/css" href="css/modify.css" />
<title>修改页面</title>
</head>
<body id="bigBox">
<form action="<%=path%>/DoUpdateOrAddUserServlet">
<input type="hidden" name="User_id" value="${requestScope.user111.user_id}"><br/>
<label>
用户名: <input type="text" name="User_name" value="${requestScope.user111.user_name}">
</label><br/>
<label>
登录密码:<input type="text" name="User_pw" value="${requestScope.user111.user_pw}">
</label><br/>
<label>
真实姓名:<input type="text" name="User_realname" value="${requestScope.user111.user_realname}">
</label><br/>
<label>
家庭住址:<input type="text" name="User_address" value="${requestScope.user111.user_address}">
</label><br/>
<label>
性别: <input type="text" name="User_sex" value="${requestScope.user111.user_sex}">
</label><br/>
<label>
电话: <input type="text" name="User_tel" value="${requestScope.user111.user_tel}">
</label><br/>
<input type="submit" value="确认">
<input type="reset" value="重置">
<input type="button" value="返回" onclick="history.back()">
</form>
</body>
</html>
<%--readonly="readonly" 只读属性--%>
6.4.5 修改页面代码(DoUpdateOrAddUserServlet.java)
package com.servlet;
import com.entity.User;
import com.service.UserService;
impimport javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
@WebServlet("/DoUpdateOrAddUserServlet")
public class DoUpdateOrAddUserServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String StrUserid = request.getParameter("User_id");
String User_name = request.getParameter("User_name");
String User_pw = request.getParameter("User_pw");
String User_realname = request.getParameter("User_realname");
String User_address = request.getParameter("User_address");
String User_sex = request.getParameter("User_sex");
String User_tel = request.getParameter("User_tel");
//当前的控制器实现俩个操作,一个是添加一个是修改数据
//添加数据(注册) 是没有User_id这个参数的值的
//而修改的必须要有pid的值,所以我们可以以此属性的值是否为空来判断,具体是什么操作
//还可以查看当前的请求是从什么路径来的
UserService us = new UserServiceImpl();
if (StrUserid != null&&!(StrUserid.equals(""))) {
int User_id = Integer.parseInt(StrUserid);
if(us.updateUserById(newUser(User_id,User_name,User_pw,User_realname,User_address,User_sex,User_tel))==1){
response.sendRedirect("/supermail_1_2_war_exploded/GetAllUserServlet");
}
}else {
if (us.addUser(new User(User_name,User_pw,User_realname,User_address,User_sex,User_tel))==1){
response.sendRedirect("/supermail_1_2_war_exploded/GetAllUserServlet");
}
}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
}
7 总结
Web 的mail 邮件开发是学习 web体系结构后收获颇多的一个项目,在着手开始之 前,查阅了许多资料。有时觉得编程这件事情,很多时候就是听起来一个功能的实现好像很难,但当你着手去实现,去研究他的实现过程的时候就会发现其实也没有想象中那么难。在编程的过程中,主要用到了MVC架构,jsp和MySQL数据库等等,了解到MVC这种模式用于应用程序的分层开发,极大的降低了开发难度,有很好的层次感。在开发的过程中,可以又把上学期的数据库知识和Html 的知识进行回顾,对这些技术的认识有了很多新的进步,对jsp的运用也有了一定的进步。
在开发的过程中,遇到很多的问题,由于自身能力不足,比如遇到了,无法从数据库中准确地获取到用户名,明明在index.jsp页面可以,到了其他页面就不行了,还有就是明明第一次打开的时候能用,再打开之后就出现了问题,幸好最后找到了问题的根源所在,是对el表达式域的概念掌握的不是很好,导致了jsp页面中的一些数据访问不到正确的servlet页面从而是用户信息获取不到,在开发的过程中此类的问题还有很多,比如对一些jar包的不熟悉不了解,没进行项目开发的时候,没有一个整体的概念和认知。
总的来说,这次的课程设计学到很多东西,java中不同类的使用及方法, 提高了编程思维能力,同时学会思考问题,提出解决代码问题方案。