一. 系统需求分析
1.1 系统需求分析
1.1.1问题描述
在企业管理中,部门和员工管理是一个复杂且重要的任务。企业需要一个高效的系统来管理部门和员工的信息,分配任务,跟踪任务完成情况,并对员工的绩效进行评估。传统的手工管理方式效率低下,容易出错,因此需要一个自动化的部门员工管理系统来提高管理效率和准确性。
课设要求:
(1)完成对管理员、员工的登陆;
(2)管理员完成对部门的增删改查;
(3)管理员完成对员工的增删改查,员工需要归属到具体的部门中;
(4)完成部门主管对员工派发任务功能。
(5)员工完成任务,要求上传任务完成情况附件。
(6)经理审核任务结果
(7)自动生成员工的绩效,经理支持导出员工绩效情况信息。
设计环境:Windows+VSCode+IDEA+JDK+Tomcat+MySQL
1.2 功能要求
1.2.1 程序的功能
管理员功能:
A.管理员、员工登录功能。
B.管理员管理部门的增删改查功能。
C.管理员管理员工的增删改查功能,员工需要归属到具体的部门中。
D.部门主管派发任务给员工。
E.管理员审核任务结果。
F.自动生成员工的绩效,并支持经理导出员工绩效情况信息。
员工功能:
A.员工登录功能。
B.员工接受任务并上传任务完成情况附件。
1.2.2输入输出的要求
输入:
A.管理员、员工的登录信息。
B.部门信息(名称、描述等)。
C.员工信息(姓名、工号、部门等)。
D.任务信息(任务描述、截止日期、分配的员工等)。
E.员工提交的任务完成情况及附件。
F.经理的审核结果。
输出:
A.登录成功或失败的提示信息。
B.部门列表、员工列表、任务列表等信息。
C.任务分配和完成情况。
D.绩效信息导出文件(CSV格式)
二.概要设计
2.1 模块设计
2.1.1 登录模块
功能:管理员、员工登录。
调用关系:调用用户验证模块,验证用户身份。
输入:用户名、密码。
输出:登录成功或失败的信息。
2.1.2 部门管理模块
功能:增删改查部门信息。
调用关系:与数据库交互模块交互,执行相应的数据库操作。
输入:部门名称、描述等信息。
输出:部门列表及操作结果。
2.1.3 员工管理模块
功能:增删改查员工信息。
调用关系:与数据库交互模块交互,执行相应的数据库操作。
输入:员工姓名、工号、部门等信息。
输出:员工列表及操作结果。
2.1.4 任务管理模块
功能:部门主管派发任务,员工提交任务,经理审核任务。
调用关系:与数据库交互模块交互,执行相应的数据库操作。
输入:任务描述、截止日期、分配的员工、完成情况附件等。
输出:任务列表及操作结果。
2.1.5 绩效管理模块
功能:生成员工绩效,导出绩效信息。
调用关系:与数据库交互模块交互,生成绩效数据并导出。
输入:无。
输出:绩效信息表及导出文件。
2.1.6 数据库交互模块
功能:与数据库进行数据操作。
调用关系:被其他各模块调用,执行具体的数据库操作。
输入:无。
输出:CSV格式的数据文件。
2.2 系统数据项和数据结构
登录表 (login): 用于存储用户的登录信息,包括用户名、密码和角色(管理员/员工)。
部门表 (department): 用于存储部门信息,包括部门ID、名称和描述。
员工表 (employee): 用于存储员工信息,包括员工ID、姓名、所属部门、职位和关联的用户ID。
任务表 (tasks): 用于存储任务信息,包括任务ID、标题、描述、关联部门、负责员工、任务状态和附件(Base64编码)。
绩效表 (task_assignment): 用于存储任务分配和绩效信息,包括任务ID、员工ID、文件名、Base64编码的文件、上传时间和审核状态。
2.3 数据库表设计
(1) 登录用户表
字段名 | 数据类型 | 长度 | 是否主键 | 描述 |
userId | int | 20 | 是 | 用户编号 |
userName | varchar | 20 | 用户名 | |
userPwd | varchar | 20 | 密码 | |
role | Varchar | 20 | 身份 |
(2)员工用户表
字段名 | 数据类型 | 长度 | 是否主键 | 描述 |
id | Int | 20 | 是 | 员工编号 |
name | varchar | 20 | 用户名 | |
department_id | int | 20 | 部门编号 | |
position | Varchar | 20 | 部门名称 | |
user_id | varchar | 20 | 用户编号 |
(3)部门表
字段名 | 数据类型 | 长度 | 是否主键 | 描述 |
id | int | 20 | 是 | 部门编号 |
name | varchar | 20 | 部门主管 | |
description | varchar | 20 | 部门名称 |
(4) 任务表
字段名 | 数据类型 | 长度 | 是否主键 | 描述 |
id | int | 20 | 是 | 编号 |
title | varchar | 20 | 标题 | |
description | varchar | 20 | 具体描述 | |
department_id | int | 20 | 部门编号 | |
employee_id | int | 20 | 用户编号 | |
status | varchar | 20 | 状态 | |
attachment | varcher | 20 | 附件 |
(5)绩效表
字段名 | 数据类型 | 长度 | 是否主键 | 描述 |
id | int | 50 | 是 | 绩效编号 |
task_id | int | 10 | 任务编号 | |
employee_id | int | 10 | 员工编号 | |
file_name | varchar | 10 | 文件名 | |
file_base64 | longtext | 10 | 文件 | |
uploaded_at | timestamp | 6 | 当前时间 | |
status | varchar | 10 | 状态 |
三.详细设计
3.1写出各模块的类算法。
3.1.1 JDBC 类算法分析
JDBC 类通过静态方法 getConn 提供了一个简单易用的接口来获取数据库连接。其实现包括以下步骤:
加载数据库驱动程序:使用 Class.forName(Dname) 动态加载数据库驱动程序类。捕获并处理 ClassNotFoundException 异常。
获取数据库连接:使用 DriverManager.getConnection(URL, Name, password) 获取数据库连接。
捕获并处理 SQLException 异常。返回数据库连接:将获取的数据库连接对象 conn 返回给调用者。
3.1.2 LoginServlet 类算法分析
LoginServlet 类的主要功能是处理用户登录请求,验证用户身份,并根据用户角色跳转到不同的页面。它通过以下步骤实现:
获取请求中的用户名和密码。连接数据库并执行查询,验证用户名和密码是否匹配。根据查询结果决定登录成功或失败,并执行相应的操作。确保在任何情况下都正确关闭数据库资源。
3.1.3 DepartmentServlet 类算法分析
doGet 方法:处理增删改查操作,调用相应的私有方法执行数据库操作。根据请求参数判断执行何种操作。
doPost 方法:将 POST 请求转发到 doGet 方法处理,确保处理逻辑一致。
数据库操作方法:
deleteDepartment: 删除部门。
updateDepartment: 更新部门信息。
addDepartment: 添加新部门。
listDepartments: 列出所有部门。
searchDepartments: 搜索部门。
通过这些方法,DepartmentServlet 类实现了对部门的增删改查操作,确保了管理员能够方便地管理部门信息。
3.1.4 EmployeeServle 类算法分析
处理 GET 和 POST 请求:
doGet 方法:处理所有 GET 请求,包括删除、编辑、添加、列出和搜索员工的操作。
doPost 方法:将 POST 请求转发到 doGet 方法处理,确保处理逻辑一致。
根据请求参数执行不同操作:
删除员工:调用 deleteEmployee 方法,通过员工 ID 删除员工信息。
编辑员工:调用 updateEmployee 方法,通过员工 ID 更新员工信息。
添加员工:调用 addEmployee 方法,添加新员工信息。
搜索员工:调用 searchEmployees 方法,根据员工 ID 或姓名进行搜索。
列出员工:调用 listEmployees 方法,列出所有员工信息。
数据库操作方法:
deleteEmployee:通过员工 ID 删除员工信息。
updateEmployee:通过员工 ID 更新员工信息。
addEmployee:添加新员工信息。
listEmployees:列出所有员工信息。
searchEmployees:根据员工 ID 或姓名进行搜索,返回匹配的员工信息。
通过这些方法,EmployeeServlet 类实现了对员工信息的增删改查操作,确保管理员能够方便地管理员工信息。
3.1.5 TaskServlet 类算法分析
处理 GET 和 POST 请求:
doGet 方法:处理所有 GET 请求,包括删除、编辑、添加、列出任务的操作。doPost 方法:将 POST 请求转发到 doGet 方法处理,确保处理逻辑一致。
根据请求参数执行不同操作:
删除任务:调用 deleteTask 方法,通过任务 ID 删除任务信息。
编辑任务:若请求中包含任务标题等参数,调用 updateTask 方法,通过任务 ID 更新任务信息。若请求中不包含任务标题等参数,查询指定 ID 的任务信息,并将其转发到任务编辑页面。
添加任务:调用 addTask 方法,添加新任务信息。
数据库操作方法:
deleteTask:通过任务 ID 删除任务信息。
updateTask:通过任务 ID 更新任务信息。
addTask:添加新任务信息。
listTasks:列出所有任务信息。
任务列表显示:从数据库中查询所有任务,并将任务信息生成 HTML 表格,设置为请求属性,转发到任务管理页面进行显示。
通过这些方法,TaskServlet 类实现了对任务信息的增删改查操作,确保管理员能够方便地管理任务信息。
3.1.6 ViewTasksServlet 类算法分析
处理 GET 和 POST 请求:
doGet 方法:处理所有 GET 请求,通过查询数据库中的任务分配信息,并将其转发到视图页面。doPost 方法:将 POST 请求转发到 doGet 方法处理,确保处理逻辑一致。
数据库操作:
获取数据库连接:通过 JDBC.getConn() 方法获取数据库连接。
查询任务分配信息:执行 SQL 查询,从 task_assignment 表中获取所有任务分配记录。
生成任务信息表格:通过查询结果集(ResultSet),动态生成 HTML 表格,展示任务分配信息,包括任务 ID、员工 ID、文件名、上传时间、审核链接和状态。
设置请求属性和转发:将生成的 HTML 表格设置为请求属性 tasks。将请求转发到 view_tasks.jsp 页面进行显示。
通过这些方法,ViewTasksServlet 类实现了对任务分配信息的查询和展示,方便管理员查看所有任务的分配情况和审核状态。
3.1.7 ReviewTaskServlet类算法分析
处理 GET 请求:获取任务信息:通过请求参数 id 获取任务分配记录的 ID,从数据库中查询相应的任务分配信息。
设置请求属性:将查询到的任务分配信息(如任务 ID、员工 ID、文件名、上传时间等)设置为请求属性。
转发请求:将请求转发到 review_task.jsp 页面,以便在页面上展示任务信息进行审核。
处理 POST 请求:获取请求参数:从请求中获取任务分配记录的 ID 和审核状态。
更新任务状态:根据任务 ID 更新数据库中相应任务分配记录的审核状态。
重定向:更新完成后,重定向到 ViewTasksServlet,以刷新任务列表页面。
数据库操作:
连接数据库:通过 JDBC.getConn() 方法获取数据库连接。
执行查询和更新:使用 PreparedStatement 预编译 SQL 语句,执行查询操作获取任务信息。通过预编译 SQL 语句,执行更新操作修改任务状态。
通过这些方法,ReviewTaskServlet 类实现了任务审核功能,管理员可以查看任务详情并更新任务的审核状态。
3.1.8 UploadServlet类算法分析
Servlet配置和注解:使用@WebServlet("/UploadServlet")注解指定Servlet的URL路径为/UploadServlet。使用@MultipartConfig注解支持文件上传功能,允许Servlet获取multipart/form-data类型的请求参数。
doPost方法:处理POST请求,接收来自客户端的文件上传请求。解析请求中的任务ID (taskId) 和员工ID (employeeId)。通过request.getPart("file")获取上传的文件部分 (Part)。使用getFileName方法从文件部分获取文件名。将文件内容读取为字节数组,并使用Base64编码转换成字符串 (fileBase64)。
数据库操作:使用JDBC建立数据库连接 (JDBC.getConn())。准备SQL语句,将任务ID、员工ID、文件名、Base64编码后的文件内容及上传时间插入到数据库表 task_assignment 中。执行SQL更新操作 (pstmt.executeUpdate())。
响应处理:如果操作成功,返回带有JavaScript警报和重定向的成功消息到客户端,提示提交成功,并跳转到 EmployeeTaskServlet。如果操作失败,返回带有错误警报的消息到客户端,并返回到上一个页面 (window.history.back()).
异常处理:捕获并打印所有异常,以确保在出现错误时能够及时通知用户提交失败。
3.1.9 EmployeeTaskServlet 类算法分析
Servlet配置和注解:使用@WebServlet("/EmployeeTaskServlet")注解指定Servlet的URL路径为/EmployeeTaskServlet,处理GET请求。
doGet方法:处理GET请求,接收来自客户端的员工ID (employee_id) 参数。解析员工ID并通过JDBC建立数据库连接 (JDBC.getConn())。准备SQL查询语句,根据员工ID从数据库中获取相关的任务信息。执行查询 (pstmt.executeQuery()) 并遍历结果集 (ResultSet),将任务信息构建为HTML表格 (tasks)。将任务信息存储在请求属性中 (request.setAttribute("tasks", tasks.toString())),并将请求转发到 employeetask_management.jsp 页面进行展示。
HTML生成和操作链接:使用StringBuilder构建HTML表格,显示每个任务的ID、标题、描述、部门ID、状态。为每个任务提供操作链接,例如标记任务完成 (<a href='complete.jsp?task_id=...&employee_id=...'>完成</a>)。
异常处理和资源释放:使用try-catch-finally块确保在操作数据库和处理请求过程中捕获并处理任何异常。在finally块中关闭ResultSet (rs)、PreparedStatement (pstmt) 和数据库连接 (conn),以释放资源并确保数据库连接的正确关闭。
3.1.10 ExportPerformanceCSVServlet 类算法分析
Servlet配置和注解:使用@WebServlet("/ExportPerformanceCSVServlet")注解指定Servlet的URL路径为/ExportPerformanceCSVServlet,处理GET请求。
doGet方法:处理GET请求,设置响应内容类型为CSV (text/csv; charset=UTF-8),并设置响应头指示文件下载 (Content-Disposition为attachment)。通过JDBC.getConn()获取数据库连接 (conn)。创建Statement (stmt) 对象执行SQL查询,从数据库中选择所有的 task_assignment 表数据。使用PrintWriter (writer) 将查询结果输出为CSV格式文件。
CSV文件生成:首先打印CSV文件的头部行,包括字段标签 ("ID,Task ID,Employee ID,File Name,File Path,Uploaded At,Status")。遍历ResultSet (rs),对每一行数据格式化输出到CSV文件中。对于每条记录,格式化输出ID、任务ID、员工ID、文件名、文件路径、上传时间、状态信息。
异常处理:使用try-with-resources语句确保资源(如数据库连接、Statement、ResultSet)在使用完毕后正确关闭。如果发生异常,打印堆栈跟踪并向响应输出错误提示,同时通过JavaScript在前端显示导出失败的警报,并将用户重定向回到 index.jsp 页面。该Servlet实现了从数据库中获取任务分配数据,并将其以CSV文件的格式提供给用户下载。它包括了基本的异常处理,确保在出现问题时向用户提供适当的反馈和导航。
3.2 前后端的调用关系图
用户操作(前端)
JSP 页面 (deparyment_management.jsp,employee_management.jsp, task_management.jsp, view_tasks.jsp, review_task.jsp)
Servlet 接收请求(后端)
|
| |-- DepartmentServlet (doGet, doPost)
| |-- addDepartment() -> INSERT INTO Department
| |-- updateDepartment() -> UPDATE Department SET
| |-- deleteDepartment() -> DELETE FROM Department
| |-- searchDepartment() -> SELECT * FROM Department
|
| |-- EmployeeServlet (doGet, doPost)
| |-- addEmployee() -> INSERT INTO employee
| |-- updateEmployee() -> UPDATE employee SET
| |-- deleteEmployee() -> DELETE FROM employee
| |-- searchEmployees() -> SELECT * FROM employee
|
| |-- TaskServlet (doGet, doPost)
| |-- addTask() -> INSERT INTO tasks
| |-- updateTask() -> UPDATE tasks SET
| |-- deleteTask() -> DELETE FROM tasks
|
| |-- ViewTasksServlet (doGet, doPost)
| |-- listTaskAssignments() -> SELECT * FROM task_assignment
|
| |-- ReviewTaskServlet (doGet, doPost)
| |-- viewTaskAssignment() -> SELECT * FROM task_assignment
| |-- updateTaskStatus() -> UPDATE task_assignment SET
|
数据库操作
页面跳转(前后端交互)
|
|-- response.sendRedirect() 或 request.getRequestDispatcher().forward()
JSP 页面显示结果