基于JSP+Servlet的企业财务管理系统 - 源码深度解析

JavaJavaScriptHTMLCSSMySQLJSP+Servlet
2026-02-263 浏览

文章摘要

基于JSP+Servlet的企业财务管理系统是一款面向中小型企业的核心业务软件,旨在解决传统手工记账或电子表格管理方式下数据分散、易出错、效率低下及缺乏标准化流程的痛点。该系统通过集中化、自动化的财务数据处理,为企业提供准确的账务记录、清晰的收支报表和严格的权限控制,核心业务价值在于提升财务工作的规...

在中小企业运营过程中,财务管理的规范化和透明化是保障企业健康发展的基石。传统的手工记账或电子表格管理方式常常面临数据分散、易出错、效率低下以及缺乏标准化流程等挑战。为解决这些痛点,一套集中化、自动化的财务数据处理系统显得尤为重要。本系统采用经典的J2EE技术体系,构建了一个结构清晰、功能完备的企业财务解决方案。

系统采用浏览器/服务器架构,以Apache Tomcat作为应用服务器,MySQL作为关系型数据库。技术栈的核心是JSP与Servlet的组合,严格遵循MVC设计模式。Servlet充当控制器,负责接收和响应所有HTTP请求,执行业务逻辑并控制页面流转;JSP作为视图层,利用JSTL标签库和EL表达式动态生成HTML页面;模型层则由一系列封装了业务数据和逻辑的JavaBean构成。数据持久化通过JDBC实现,在DAO层编写SQL语句完成对数据库的操作。这种分层架构有效降低了代码耦合度,提高了系统的可维护性和可扩展性。

数据库架构设计与核心表分析

数据库设计是系统稳定运行的基石。本系统共设计了8张核心数据表,涵盖了用户、部门、资产、业务、收支等关键实体。其ER图清晰地展示了表间的关联关系。

数据库设计

以下重点分析两个核心表的设计:

1. 用户表的设计 用户表是系统权限体系的核心,它不仅存储了员工的基本信息,还通过role字段实现了基于角色的访问控制。

CREATE TABLE `t_employee` (
  `employeeId` int(11) NOT NULL AUTO_INCREMENT,
  `employeeNo` varchar(20) DEFAULT NULL,
  `employeeName` varchar(20) DEFAULT NULL,
  `password` varchar(20) DEFAULT NULL,
  `role` int(11) DEFAULT NULL COMMENT '1:管理员 2:普通员工',
  `departmentId` int(11) DEFAULT NULL,
  `sex` varchar(10) DEFAULT NULL,
  `email` varchar(20) DEFAULT NULL,
  `phone` varchar(20) DEFAULT NULL,
  `bornDate` datetime DEFAULT NULL,
  `hireDate` datetime DEFAULT NULL,
  `photo` varchar(100) DEFAULT NULL,
  `salary` decimal(10,2) DEFAULT NULL,
  `memo` varchar(500) DEFAULT NULL,
  PRIMARY KEY (`employeeId`),
  KEY `FK_Reference_1` (`departmentId`),
  CONSTRAINT `FK_Reference_1` FOREIGN KEY (`departmentId`) REFERENCES `t_department` (`departmentId`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8;

设计亮点分析:

  • 角色权限控制role字段使用整型标识用户角色(1为管理员,2为普通员工),这种设计便于在Servlet中进行权限校验,例如限制某些功能只能由管理员访问。
  • 外键约束departmentId字段通过外键关联部门表,确保了数据的一致性,即一个员工必须属于一个已存在的部门。
  • 敏感信息处理salary字段使用DECIMAL(10,2)类型,精确存储薪资信息,避免浮点数计算误差。password字段虽然在本设计中为明文存储,但在实际生产环境中应结合Salt进行哈希加密。

2. 资产信息表的设计 资产信息表记录了企业的固定资产,是财务核算的重要组成部分。

CREATE TABLE `t_asset` (
  `assetId` int(11) NOT NULL AUTO_INCREMENT,
  `assetNo` varchar(20) DEFAULT NULL,
  `assetName` varchar(50) DEFAULT NULL,
  `assetType` int(11) DEFAULT NULL COMMENT '1:设备 2:房产 3:运输工具 4:其它',
  `price` decimal(10,2) DEFAULT NULL,
  `buyDate` datetime DEFAULT NULL,
  `employeeId` int(11) DEFAULT NULL,
  `memo` varchar(500) DEFAULT NULL,
  `addDate` datetime DEFAULT NULL,
  PRIMARY KEY (`assetId`),
  KEY `FK_Reference_3` (`employeeId`),
  CONSTRAINT `FK_Reference_3` FOREIGN KEY (`employeeId`) REFERENCES `t_employee` (`employeeId`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

设计亮点分析:

  • 资产类型枚举assetType字段使用注释明确了资产分类,这种设计便于后续根据类型进行统计和折旧计算。
  • 责任人关联:通过employeeId外键关联到具体员工,明确了每项资产的管理责任人,实现了资产管理的精细化。
  • 时间戳记录buyDate记录购买日期,addDate记录系统录入日期,有助于进行资产生命周期管理。

核心功能实现与代码解析

1. 用户登录与权限验证

用户登录是系统的入口,也是安全的第一道防线。系统提供了不同角色的登录界面。

管理员登录

登录功能的核心由LoginServlet处理,它验证用户凭证并根据角色跳转到不同的主页。

// LoginServlet.java 中的核心验证逻辑
public class LoginServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        String employeeNo = request.getParameter("employeeNo");
        String password = request.getParameter("password");
        
        EmployeeService employeeService = new EmployeeService();
        Employee employee = employeeService.login(employeeNo, password);
        
        if(employee != null) {
            HttpSession session = request.getSession();
            session.setAttribute("currentUser", employee);
            
            if(employee.getRole() == 1) {
                response.sendRedirect("admin/main.jsp");
            } else {
                response.sendRedirect("employee/main.jsp");
            }
        } else {
            request.setAttribute("error", "工号或密码错误!");
            request.getRequestDispatcher("login.jsp").forward(request, response);
        }
    }
}
// EmployeeService.java 中的业务逻辑
public class EmployeeService {
    public Employee login(String employeeNo, String password) {
        EmployeeDao employeeDao = new EmployeeDao();
        Employee employee = employeeDao.getEmployeeByNo(employeeNo);
        
        if(employee != null && password.equals(employee.getPassword())) {
            return employee;
        }
        return null;
    }
}

技术要点:

  • 会话管理:登录成功后,将员工对象存储在HttpSession中,作为用户身份的凭证。
  • 角色分流:根据role字段的值,将管理员和普通员工重定向到不同的主页面,实现界面和功能的隔离。
  • DAO层封装EmployeeDao负责实际的数据库查询,Service层处理业务逻辑,符合分层架构原则。

2. 资产管理功能

资产管理模块允许管理员对企业资产进行全面的CRUD操作。

资产管理

资产添加功能的核心代码如下:

// AssetAddServlet.java
public class AssetAddServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        
        String assetNo = request.getParameter("assetNo");
        String assetName = request.getParameter("assetName");
        int assetType = Integer.parseInt(request.getParameter("assetType"));
        BigDecimal price = new BigDecimal(request.getParameter("price"));
        // 其他参数获取...
        
        Asset asset = new Asset();
        asset.setAssetNo(assetNo);
        asset.setAssetName(assetName);
        asset.setAssetType(assetType);
        asset.setPrice(price);
        // 设置其他属性...
        asset.setAddDate(new Date());
        
        AssetService assetService = new AssetService();
        boolean result = assetService.addAsset(asset);
        
        if(result) {
            response.sendRedirect("assetManage?flag=1");
        } else {
            request.setAttribute("error", "资产添加失败!");
            request.getRequestDispatcher("assetAdd.jsp").forward(request, response);
        }
    }
}
// AssetService.java
public class AssetService {
    public boolean addAsset(Asset asset) {
        AssetDao assetDao = new AssetDao();
        return assetDao.addAsset(asset) > 0;
    }
}
// AssetDao.java 中的数据库操作
public class AssetDao {
    public int addAsset(Asset asset) {
        String sql = "INSERT INTO t_asset (assetNo, assetName, assetType, price, buyDate, employeeId, memo, addDate) " +
                    "VALUES (?, ?, ?, ?, ?, ?, ?, ?)";
        Object[] params = {
            asset.getAssetNo(), asset.getAssetName(), asset.getAssetType(),
            asset.getPrice(), asset.getBuyDate(), asset.getEmployeeId(),
            asset.getMemo(), asset.getAddDate()
        };
        
        return DbUtil.executeUpdate(sql, params);
    }
}

技术要点:

  • 数据验证:在实际应用中,应对输入数据进行严格的验证,如资产编号的唯一性检查。
  • 事务管理:复杂的业务操作可能需要数据库事务支持,确保数据的一致性。
  • 金额处理:使用BigDecimal类型处理金融数据,避免浮点数精度问题。

3. 财务报表查询与分析

系统提供了多维度财务数据查询功能,支持按时间、部门等条件进行统计分析。

资产分析

资产查询的JSP页面利用JSTL标签库动态展示数据:

<!-- assetQuery.jsp 片段 -->
<table class="table table-bordered table-hover">
    <tr>
        <th>资产编号</th>
        <th>资产名称</th>
        <th>资产类型</th>
        <th>价值(元)</th>
        <th>购买日期</th>
        <th>管理人</th>
    </tr>
    <c:forEach items="${assetList}" var="asset">
        <tr>
            <td>${asset.assetNo}</td>
            <td>${asset.assetName}</td>
            <td>
                <c:choose>
                    <c:when test="${asset.assetType == 1}">设备</c:when>
                    <c:when test="${asset.assetType == 2}">房产</c:when>
                    <c:when test="${asset.assetType == 3}">运输工具</c:when>
                    <c:otherwise>其它</c:otherwise>
                </c:choose>
            </td>
            <td><fmt:formatNumber value="${asset.price}" pattern="#,##0.00"/></td>
            <td><fmt:formatDate value="${asset.buyDate}" pattern="yyyy-MM-dd"/></td>
            <td>${asset.employee.employeeName}</td>
        </tr>
    </c:forEach>
</table>

技术要点:

  • JSTL应用:使用<c:forEach>遍历集合,<c:choose>进行条件判断,使页面逻辑清晰。
  • 格式化输出<fmt:formatNumber><fmt:formatDate>标签实现数据的本地化格式化显示。
  • EL表达式:通过${}语法直接访问JavaBean属性,简化了页面代码。

4. 权限控制与安全机制

系统通过过滤器实现统一的权限验证,确保未登录用户或权限不足的用户无法访问受限资源。

// PermissionFilter.java
public class PermissionFilter implements Filter {
    public void doFilter(ServletRequest request, ServletResponse response, 
            FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse resp = (HttpServletResponse) response;
        HttpSession session = req.getSession();
        
        String uri = req.getRequestURI();
        
        // 放行登录相关资源和静态资源
        if(uri.contains("login") || uri.contains("static")) {
            chain.doFilter(request, response);
            return;
        }
        
        Employee currentUser = (Employee) session.getAttribute("currentUser");
        if(currentUser == null) {
            resp.sendRedirect(req.getContextPath() + "/login.jsp");
            return;
        }
        
        // 管理员权限验证
        if(uri.contains("admin") && currentUser.getRole() != 1) {
            resp.sendRedirect(req.getContextPath() + "/error/403.jsp");
            return;
        }
        
        chain.doFilter(request, response);
    }
}

技术要点:

  • 过滤器链:通过实现Filter接口,在请求到达Servlet前进行拦截验证。
  • 路径排除:对登录页面和静态资源不进行权限验证,避免重定向循环。
  • 角色验证:根据请求路径和用户角色进行细粒度的权限控制。

实体模型与业务对象设计

系统的模型层由一系列JavaBean构成,这些对象不仅封装了数据,还体现了业务领域的核心概念。

资产实体类设计:

public class Asset {
    private Integer assetId;
    private String assetNo;
    private String assetName;
    private Integer assetType; // 1:设备 2:房产 3:运输工具 4:其它
    private BigDecimal price;
    private Date buyDate;
    private Integer employeeId;
    private Employee employee; // 关联的员工对象
    private String memo;
    private Date addDate;
    
    // 构造方法、getter和setter省略...
}

技术要点:

  • 对象关联Asset类中包含Employee对象引用,体现了对象间的关联关系,便于在视图层直接访问关联对象的属性。
  • 数据类型选择:使用BigDecimal处理金额,Date处理日期时间,确保了数据的精确性。

功能展望与系统优化方向

虽然当前系统已经实现了核心的财务管理功能,但在实际企业应用场景中,仍有多个方向可以进一步优化和扩展:

  1. 集成高级数据分析与可视化

    • 实现思路:引入ECharts等前端图表库,开发资产折旧趋势分析、收支对比图表等功能。后端可增加专门的数据统计Service,提供聚合数据接口。
    • 技术方案:在DAO层编写复杂的SQL查询语句进行多维度数据统计,通过JSON格式将数据传递给前端进行可视化展示。
  2. 工作流引擎集成

    • 实现思路:集成Activiti或Flowable等工作流引擎,实现费用报销、采购申请等业务流程的电子化审批。
    • 技术方案:将现有的简单状态字段升级为完整的工作流模型,为每个业务流程定义节点、流转条件和审批人规则。
  3. 系统性能优化

    • 实现思路:引入数据库连接池(如HikariCP)、查询结果缓存(Redis)、页面静态化等技术提升系统响应速度。
    • 技术方案:替换简单的JDBC连接为连接池管理,对频繁访问且更新不频繁的数据(如部门信息)进行缓存。
  4. 安全机制增强

    • 实现思路:增加密码加密存储、登录失败次数限制、操作日志审计、数据备份与恢复等功能。
    • 技术方案:使用BCrypt等算法对密码进行哈希加密,通过AOP技术实现关键操作的行为日志记录。
  5. 移动端支持

    • 实现思路:开发基于RESTful API的移动端应用,支持员工随时随地提交报销申请、查询薪资等信息。
    • 技术方案:将现有的Servlet重构为RESTful风格的接口,使用JSON作为数据交换格式,前后端完全分离。

这套企业财务管理系统通过严谨的架构设计和扎实的技术实现,为企业提供了一个稳定可靠的财务管理平台。其清晰的代码结构和完善的功能模块,不仅满足了企业日常财务管理的需求,也为后续的功能扩展和技术升级奠定了良好的基础。系统的权限管理体系确保了财务数据的安全性,而多角度的查询统计功能则为管理者的决策提供了有力支持。随着企业规模的扩大和业务需求的变化,系统可以通过上述优化方向持续演进,更好地服务于企业的财务管理需求。

本文关键词
JSPServlet企业财务管理MVCMySQL

上下篇

上一篇
没有更多文章
下一篇
没有更多文章