资讯详情

Java毕业设计企业报销管理系统:数据库还原与二次开发实战指南

📅 2026/10/9 8:08:43 | 华诺云谱 👁 阅读
Java毕业设计企业报销管理系统:数据库还原与二次开发实战指南
简介一份面向Java毕业设计的企业报销管理系统完整项目包适合计算机相关专业学生作为毕设参考或课程设计模板。系统采用Client/Server模式使用Java语言开发并以SQL Server 2000作为数据库覆盖个人工作、信息中心、日常工作、流转中心、维护中心五个子系统实现电话簿管理、公告发布、制度与新闻展示、资料管理、办公用品申领、公文流转和权限配置等功能能有效优化企业办公流程。压缩包内共206个文件包含Java源码及对应的class编译文件、论文文档、PPT演示模板、数据库备份文件、界面图标与动图素材等整体大小约11.53MB配置好Java环境即可运行。目前已有46人学习。借助这份资源可以快速掌握报销管理系统的分层设计与核心业务实现同时利用配套论文和PPT打包答辩材料也便于在此基础上扩展新功能。1. 企业报销管理系统这套Java毕业设计源码、论文、PPT都在但先别急着双击一个zip解压后里面是.class文件、一个.java.bak、一个SQL Server的.bak数据库备份。这是不少Java毕业设计资源的典型长相标题写着“企业报销管理系统”类名里却找不到一个叫BaoXiao的类。别急着吐槽这套系统的真实身份是Java Swing SQL Server 2000的C/S办公自动化系统报销功能藏在“流转中心”的通用审批流程里个人办公、信息中心、日常工作、维护管理五大模块齐全。它能帮你交付一个能跑通“登录→操作→审批→归档”闭环的Java原生GUI毕设论文和PPT模板也齐想练手改造的人也能拿它当老式Swing分层结构的样本。前提是先让这些class和bak文件跑起来过程不轻松坑也不少。2. 先看清压缩包里的家底从.class反推功能边界与数据表2.1 类文件命名规则与真实功能拿到压缩包先别急着解压运行把文件清单拉出来看一遍。清单里有ZhuFrame、ZhuCe、DengLu、ZiLiao、BuMenXiuGai、ZhiYuanZiLiaoXiuGai这类拼音命名类。稍微懂一点Java的人都能看出来这是一个典型的Swing界面项目ZhuFrame是主窗体DengLu是登录窗体ZhuCe是注册ZiLiao是资料类ZiLiaoXiuGai是资料修改ZhiYuanZiLiaoXiuGai是职员资料修改BuMenXiuGai是部门修改ZuXiuGai是组修改还有一个ZhuFrame.java.bak的主窗体备份源码。注意这份清单里没有出现“BaoXiao”“ShenPi”这种与报销强相关的类名。这说明报销业务没有被做成一棵独立的菜单树而是挂在“流转中心”这个通用公文流转模块里作为流程的一个实例存在。报账单、审批单在代码层面都是“公文”。这个发现很关键。你答辩的时候如果被问“报销流程在哪”不要慌按公文流转的收文、发文、批阅、转出、归档去讲就行。反过来这也提醒你如果要把它包装成“企业报销管理系统”最好在论文里把报销流程映射到流转中心的用例图里否则评审老师会较真。2.2 压缩包里没有.java源码怎么办理想情况下资源里应该附带完整源码但现实是很多包只放了编译后的class。如果解压之后没有src目录你需要反编译。我一般用JD-GUI图形化打开就能看到大致逻辑。命令行场景下用CFR更顺手# 用cfr反编译单个class文件到指定目录 java -jar cfr.jar DengLu.class --outputdir ./src参数说明cfr.jar是反编译工具包DengLu.class是要反编译的类文件--outputdir指定输出目录。反编译出来的代码不一定能直接编译回去因为class文件里不保留注释和局部变量名但看懂控制流、找到数据库连接字符串、找到登录逻辑足够你改造成自己的东西。如果资源里原本就有.java文件能省这一步但.java.bak这种备份文件也值得打开看看里面往往是某个版本的源码比反编译结果干净得多。2.3 .bak数据库备份的还原SQL Server 2000的备份怎么在2008上恢复数据库备份文件一般叫*.bak但这个项目用的是SQL Server 2000。如果你电脑上装的是2008 R2或者2012直接还原大概率报版本兼容错误。先在SSMS里执行一句看备份头的命令RESTORE HEADERONLY FROM DISK NC:\your_path\your_db.bak;如果返回结果里有DatabaseName和BackupType说明备份文件本身没坏。接下来尝试还原RESTORE DATABASE EnterpriseOA FROM DISK NC:\your_path\your_db.bak WITH REPLACE, MOVE NOA_Data TO NC:\SQLData\EnterpriseOA.mdf, MOVE NOA_Log TO NC:\SQLData\EnterpriseOA_log.ldf;解释EnterpriseOA是你要恢复出来的数据库名MOVE后面的逻辑文件名要跟RESTORE FILELISTONLY查出来的一致所以我一般会先跑一句RESTORE FILELISTONLY FROM DISK NC:\your_path\your_db.bak;拿到逻辑名再填到MOVE里。如果2000的bak在2008上实在还原不了常见做法是找一台装有SQL Server 2000或2005的机器先还原再用“生成脚本”把表结构和数据导成SQL脚本拿到新库执行。这个操作虽然绕但能救回数据。2.4 核心数据表结构推测员工表、部门表与报销单表结合模块功能这套系统至少要有员工表、部门表、电话簿表、公告表、规章制度表、新闻表、资料表、办公用品申领表、公文流转表。它不像现在用MyBatis Plus那样直接根据实体类生成建表语句2000年代的项目通常是手写SQL表名字段名也都是拼音或英文缩写。下面是我按业务逻辑推测的最小表结构建库的时候可以直接用现代SQL Server语法执行CREATE TABLE Employees ( EmpID INT IDENTITY(1,1) PRIMARY KEY, EmpNo VARCHAR(20) NOT NULL, EmpName NVARCHAR(50) NOT NULL, DeptID INT NOT NULL, [Password] VARCHAR(64) NOT NULL, RoleID INT NOT NULL, Phone VARCHAR(30), Email VARCHAR(100) ); CREATE TABLE Reimburse ( BillID INT IDENTITY(1,1) PRIMARY KEY, EmpID INT NOT NULL REFERENCES Employees(EmpID), Title NVARCHAR(100) NOT NULL, Amount DECIMAL(18,2) NOT NULL, ApplyDate DATETIME NOT NULL DEFAULT GETDATE(), FlowState INT NOT NULL DEFAULT 0, CurrentUserID INT NULL );说明Reimburse是我按报销场景补的原库不一定有但字段设计已经对应了流转中心的四个环节FlowState从0到3和公文流转的“拟稿→批阅→转出→归档”一一对应。如果后面要做二次开发这张表就是你的业务底座。Employees表里的RoleID则对应维护中心里的权限角色定义先占住这个外键后面做权限控制才省事。2.5 论文与PPT模板怎么对照代码结构这个包里还带了论文和PPT模板。很多人的误区是拿着模板直接改题目结果论文里的框架图和代码里的菜单对不上。正确做法是先看论文目录找到“系统功能模块设计”那一章把里面的模块名和主窗体的菜单项逐一核对。我一般会做一张对照表论文里的“个人工作子系统”对应代码里的电话簿和总经理工作计划“信息中心”对应公告、制度、新闻“流转中心”就是公文收发审批。如果论文里写了“报销管理”而代码里没有那就在论文里补一段“报销审批是公文流转的特例”来圆场。模板的价值是提供结构和排版不是让你照着背这个心理准备要有。3. 把系统跑起来JDK环境、数据库连接与启动参数3.1 为什么我劝你用JDK 1.8而不是Java 11这套代码是Swing写的年代感很强。Swing本身在Java 11之后没被移除但如果你用Java 17跑老代码遇到IllegalAccessError或者ClassNotFoundException的概率会增加尤其是项目里用了com.sun.*内部包的情况下。而且当年很多连接SQL Server的驱动是com.microsoft.jdbc.sqlserver.SQLServerDriver这个旧驱动在高版本JDK里经常跑不起来。所以我一般会装一个JDK 1.8既保留Swing兼容性又能跑大部分JDBC驱动。设置环境变量JAVA_HOMEC:\Program Files\Java\jdk1.8.0_202 PATH%JAVA_HOME%\bin;%PATH% CLASSPATH.;D:\lib\sqljdbc4.jar;D:\project\classes这里CLASSPATH除了.之外还包含了SQL Server驱动sqljdbc4.jar。如果是旧项目的lib目录可能叫msbase.jar、mssqlserver.jar、msutil.jar三件套那是SQL Server 2000时代的驱动能用但建议换成sqljdbc4.jar后面连接字符串也要相应改动。3.2 数据库登录账号与JDBC连接参数还原数据库之后先建一个专用的数据库登录账号避免用sa裸奔。我用SQL Server 2008 R2做演示执行USE [master]; GO CREATE LOGIN oa_user WITH PASSWORDNoa2024, DEFAULT_DATABASEEnterpriseOA; GO USE EnterpriseOA; GO CREATE USER oa_user FOR LOGIN oa_user; GO EXEC sp_addrolemember Ndb_owner, Noa_user; GO参数说明登录账号oa_user密码oa2024默认数据库EnterpriseOA。授db_owner而不是db_datareader是因为老程序里可能涉及建表、临时表操作权限给太小会莫名报错。JDBC连接字符串长这样String url jdbc:sqlserver://localhost:1433;DatabaseNameEnterpriseOA;useroa_user;passwordoa2024;; Connection conn DriverManager.getConnection(url);注意如果驱动是com.microsoft.sqlserver.jdbc.SQLServerDriverURL必须是jdbc:sqlserver://如果是老款com.microsoft.jdbc.sqlserver.SQLServerDriverURL要用jdbc:microsoft:sqlserver://localhost:1433;DatabaseName...。我见过很多人混用这两个格式导致连不上这是典型翻车点。3.3 没有源码时怎么改数据库连接反编译后重编译的基本操作如果只有class文件找到连接字符串最直接的办法是反编译后全局搜jdbc。用CFR反编译整个目录然后在IDE里搜索找到类似这样的代码Class.forName(com.microsoft.jdbc.sqlserver.SQLServerDriver); String url jdbc:microsoft:sqlserver://localhost:1433;DatabaseNameoa;usersa;password123456;这串写死在代码里的连接必须改。改完要怎么编译回去我一般不用反编译的一整个工程而是单独把这一个类改完配合其他class一起放进classes目录运行。如果要完整点可以把反编译出的所有.java文件拷到一个新工程补上缺失的lib然后重新编译。命令javac -encoding UTF-8 -cp D:\lib\sqljdbc4.jar;D:\project\classes -d D:\project\classes src/com/oa/*.java说明-encoding UTF-8解决中文注释乱码问题-cp指定编译依赖的classpath包含驱动和目标class目录-d指定编译产物输出目录。编译时你可能看到一堆warning不用管只要没有error: incompatible types就行。老项目里Vector、DefaultTableModel这些API在高版本JDK下编译会有废弃警告不影响运行。3.4 启动批处理让ZhuFrame跑起来后端数据库准备好编译或反编译的class就位就可以通过批处理启动了。新建一个run.batecho off set JAVA_HOMEC:\Program Files\Java\jdk1.8.0_202 set CLASSPATH.;D:\lib\sqljdbc4.jar;D:\project\classes %JAVA_HOME%\bin\java ZhuFrame pause参数说明ZhuFrame是主类名不带.class后缀pause只是让黑窗口在出错时停留方便截图报错。如果运行时提示Could not find or load main class先检查CLASSPATH里有没有包含ZhuFrame.class所在的目录再检查类名大小写。登录窗体出来后先用注册功能建一个账号再到数据库里手动把该账号的RoleID改成管理员对应的值否则你登录进去看不到维护中心菜单。这一步是无数人卡住的地方我后面在避坑章里单独说。3.5 登录后白屏或卡死的排查顺序有时候登录按钮点下去窗体卡住不动看起来像死机。这种情况多半发生在连接数据库那一步——JDBC连接超时时间太长。老代码里连接字符串没设loginTimeout需要等默认的30秒甚至更久才会报错。我的排查顺序是先看黑窗口有没有堆栈信息有就按堆栈找行号没有就开SQL Server Profiler看有没有来自oa_user的连接请求。如果连请求都没有问题在驱动或URL如果有请求但被拒绝问题在账号权限或防火墙。另外老代码里经常用Statement.executeQuery查完不关资源第一次跑没问题连续操作几次后就卡死原因就是连接泄漏。这种玄学问题最有效的预防是在代码里用try-with-resources把Connection、Statement、ResultSet都包进去。4. 二次开发实战把报销功能从通用流转中心里拆出来4.1 为什么说报销审批就是公文流转的一个特例这套系统原生的“流转中心”管理的是收文和发文所谓“收文”“发文”本质上都是一份带状态的数据记录在不同角色手里传递。报销单也一样员工提交一张报销单部门主管批阅财务复核最后归档。区别只是表单字段不同、审批路径不同。所以我做二次开发时不会去碰原来的流转中心代码而是直接新建一个报销单模块复用它的状态机模型。公文流转状态报销单状态操作角色拟稿/收文草稿员工批阅部门审批部门主管转出财务审批财务人员归档归档系统管理员这张对应关系可以直接写进你的毕业论文需求分析里评审老师一看就知道你理解了原系统而不是乱改。4.2 新写一个报销单管理窗体JTable展示 审批按钮做二次开发我会新建一个BaoXiaoFrame.java里面放一个JTable和一个“通过”按钮。关键逻辑是先查所有待审批的报销单展示到表格点击通过后更新状态。示例代码import javax.swing.*; import java.awt.*; import java.sql.*; public class BaoXiaoFrame extends JFrame { private JTable table; private DefaultTableModel model; public BaoXiaoFrame() { setTitle(报销单审批); model new DefaultTableModel(new String[]{单号, 申请人, 金额, 状态}, 0); table new JTable(model); add(new JScrollPane(table), BorderLayout.CENTER); JButton pass new JButton(通过当前行); pass.addActionListener(e - approveCurrentRow()); add(pass, BorderLayout.SOUTH); loadPending(); setSize(600, 400); setVisible(true); } private void loadPending() { try (Connection conn DriverManager.getConnection( jdbc:sqlserver://localhost:1433;DatabaseNameEnterpriseOA;useroa_user;passwordoa2024, oa_user, oa2024)) { Statement st conn.createStatement(); ResultSet rs st.executeQuery(SELECT BillID, EmpID, Amount, FlowState FROM Reimburse WHERE FlowState 1); while (rs.next()) { model.addRow(new Object[]{rs.getInt(1), rs.getInt(2), rs.getDouble(3), rs.getInt(4)}); } } catch (SQLException ex) { JOptionPane.showMessageDialog(this, 加载失败: ex.getMessage()); } } private void approveCurrentRow() { int row table.getSelectedRow(); if (row 0) return; int billId (Integer) model.getValueAt(row, 0); try (Connection conn DriverManager.getConnection( jdbc:sqlserver://localhost:1433;DatabaseNameEnterpriseOA;useroa_user;passwordoa2024, oa_user, oa2024)) { PreparedStatement ps conn.prepareStatement( UPDATE Reimburse SET FlowState 2 WHERE BillID ?); ps.setInt(1, billId); ps.executeUpdate(); model.setValueAt(2, row, 3); } catch (SQLException ex) { JOptionPane.showMessageDialog(this, 审批失败: ex.getMessage()); } } }这段代码的思路很直接JTable搭配DefaultTableModel在loadPending()里查FlowState1的记录也就是部门审批阶段的单据approveCurrentRow()先把状态改成2也就是财务审批阶段。参数说明FlowState的取值要和前面建表时的约定一致如果你想让审批按钮只能点击一次可以加一个table.getSelectionModel()监听这里从简。实际项目中我会用PreparedStatement而不是Statement防止SQL注入上面代码已经用了。4.3 把新模块接入权限维护中心里没配角色就看不见新窗体写完还要让它出现在主窗体的菜单里。原系统的主菜单是在ZhuFrame里用JMenuBar构建的找到那个位置加入一个“报销管理”菜单项。但更接近原系统设计的做法是在菜单点击事件里判断当前登录用户的RoleID不是财务相关角色就弹窗拒绝。示例if (currentUserRole ! ROLE_FINANCE) { JOptionPane.showMessageDialog(this, 当前账号无审批权限请联系管理员调整角色); return; } new BaoXiaoFrame().setVisible(true);这里currentUserRole是登录成功后从Employees表里取出来的RoleID。我的习惯是把角色常量定义在一个Constants类里比如ROLE_EMPLOYEE1、ROLE_MANAGER2、ROLE_FINANCE3。别把数字散落在各个类里否则后面改权限分配的时候会想骂人。4.4 让报销单支持附件路径把文件路径存进数据库原系统的公文流转大概率只记录文字信息不存附件。但报销不能没有发票图片或PDF扫描件。低成本方案是在Reimburse表里加一列只存文件路径不把文件本身放进数据库这样能避开BLOB处理的一堆麻烦。SQL改成ALTER TABLE Reimburse ADD AttachPath NVARCHAR(255) NULL;Java代码在保存时把选中的文件复制到项目下的attachments目录再把绝对路径存进字段String targetPath attachments/ System.currentTimeMillis() _ fileName; Files.copy(source.toPath(), Path.of(targetPath), StandardCopyOption.REPLACE_EXISTING);展示时用Desktop.getDesktop().open(new File(attachPath))调起系统关联程序。注意答辩用的机器上一定要提前装好能打开该格式的软件否则现场双击没反应比不加附件还尴尬。5. 避坑指南这份毕业设计最容易翻车的5个地方5.1 启动报错ClassNotFoundException: com.microsoft.jdbc.sqlserver.SQLServerDriver现象运行ZhuFrame后黑窗口直接抛出java.lang.ClassNotFoundException说明驱动类找不到。原因classpath里没有放SQL Server驱动jar或者放的驱动版本和Class.forName里的类名不匹配。老驱动类名是com.microsoft.jdbc.sqlserver.SQLServerDriver对应msbase.jar、mssqlserver.jar、msutil.jar新驱动类名是com.microsoft.sqlserver.jdbc.SQLServerDriver对应sqljdbc4.jar。解决先确认连接代码里写的类名再下载对应驱动并放到CLASSPATH。如果只有新驱动就把代码里的Class.forName改成新类名同时把URL里的jdbc:microsoft:sqlserver://改成jdbc:sqlserver://别两个都留着。最简单的验证方法是写一个独立的小类只做Class.forName能过说明驱动没问题。5.2 数据库备份还原失败报版本不兼容现象在SQL Server 2012里还原.bak提示System.Data.SqlClient.SqlError: The database was backed up on a server running version 8.00.xxxx。原因备份文件来自SQL Server 2000版本8.0高版本SQL Server默认不直接支持低版本备份还原。解决三个办法按成本排序。第一用SQL Server 2008 R2或更早版本还原因为2008 R2还支持部分2000备份第二用2000数据库把表数据脚本化导出再到新库执行第三如果备份只有表和索引可以尝试先用RESTORE HEADERONLY确认逻辑文件名再用WITH MOVE强制还原但成功概率不高。我亲眼见过有人卡在这里一个下午最后换了一台2005的虚拟机搞定。5.3 中文全部显示成问号现象登录后界面上所有中文菜单和按钮都变成???或者从数据库读出来的中文是乱码。原因JDBC连接时没有指定字符集SQL Server 2000的默认排序规则又是中文环境的两边编码对不上。Swing界面的JFrame.setTitle里的中文没问题但从数据库读出来的字符串会乱码。解决在JDBC URL后面加参数新驱动jdbc:sqlserver://localhost:1433;DatabaseNameEnterpriseOA;characterEncodingGBK如果你的JDBC版本不接受这个参数在取字符串后手动转码String name rs.getString(EmpName); name new String(name.getBytes(ISO-8859-1), GBK);第二种是玄学但管用很多老项目都这么干过。最好还是统一把数据库排序规则设成Chinese_PRC_CI_AS一劳永逸。5.4 双击class文件不能运行还报“No main”现象在资源管理器里双击ZhuFrame.class弹出窗口说找不到main方法或者直接打开class文件乱码。原因class文件需要JVM解释执行Windows不会自动关联到java命令。而且如果ZhuFrame里main方法是完整签名public static void main(String[] args)直接双击也跑不起来因为没有classpath和依赖。解决老老实实用批处理。把JAVA_HOME、CLASSPATH都写进run.bat用java ZhuFrame启动。如果提示No main用javap ZhuFrame查看反汇编输出确认main方法是否真的存在。有时候备份的.java.bak里的是没有main的版本编译出来的class自然起不来。5.5 登录进去了但看不到“维护中心”菜单现象注册新用户后正常登录主窗体里只有个人工作、信息中心、日常工作、流转中心唯独没有维护中心。原因维护中心只有管理员角色可见。代码里大概率是拿当前用户的RoleID去控制菜单可见性而注册功能默认给的是普通员工角色。解决先在登录界面找到当前账号的EmpID然后到数据库执行UPDATE Employees SET RoleID (SELECT RoleID FROM Employees WHERE EmpNoadmin) WHERE EmpNo你的登录账号;如果找不到admin就先看Roles表里哪个角色名带“管理员”把对应的RoleID抄过来。执行完重新登录菜单就出来了。这是改动最小、见效最快的办法千万别试着去反编译找判断逻辑。6. 答辩演示三分钟讲清业务闭环评审追问也不慌6.1 演示脚本先讲流程再跑系统我总结了一套不会翻车的演示顺序先在白板上画一条线——员工登录 - 填写报销申请 - 部门主管审批 - 财务审批 - 归档。然后用系统演示登录但要避开注册环节因为注册后还要手动改角色太慢了。提前准备好两个账号一个普通员工、一个管理员。演示时用员工账号提交一张报销单如果系统没有报销界面就演示公文流转的收文流程并说明“把单据字段换成报销字段就是报销审批”再切换管理员把流程批下去。全程控制在三分钟剩下的时间留给提问。6.2 提前做实验脚本避免现场手忙脚乱答辩机器上不要现场敲SQL我一般会写一个schema_check.sql内容只有三条检查关键表是否存在、检查核心账号是否启用、检查数据库版本。运行完截图保存。数据库连不上是现场最常见的灾难准备一个“一键启动”批处理把SQL Server服务和程序启动绑在一起net start MSSQLSERVER cd /d D:\project java ZhuFrame这里MSSQLSERVER是SQL Server的服务名如果是命名实例改成MSSQL$实例名。如果怕服务没装就在批处理前手动确认。6.3 低成本提升观感改外观和字体老Swing程序默认的Metal外观很显旧答辩前可以在ZhuFrame的main方法里加一行try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (Exception ignored) {}这行代码让界面跟随Windows主题观感立刻不一样。字体也建议在main里设置UIManager.put(MenuBar.font, new Font(微软雅黑, Font.PLAIN, 12)); UIManager.put(MenuItem.font, new Font(微软雅黑, Font.PLAIN, 12));这只是表层美化不影响任何业务逻辑但给你的演示加分不少。那次答辩我就是凭着这个改动评审老师夸界面“像个正规系统”其实我只花了两分钟。从那以后我每次拿到这类老毕设资源都先按流程跑一遍看清单、反编译确认源码完整性、还原数据库、改连接串、再谈功能改造。这套顺序救了我好多次希望帮到你。本文还有配套的精品资源点击获取
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑