
简介这是一套面向Java毕业设计场景的企业报销管理系统完整项目涵盖源代码、毕业论文和PPT模板适合需要完成OA类课题或学习传统C/S架构开发的学生。系统基于Java与SQL Server 2000实现包含个人工作、信息中心、日常工作、流转中心、维护中心等模块能覆盖公告发布、资料管理、办公用品申领、公文流转等典型办公自动化需求。压缩包共206个文件大小约11.53MB以class、java源码、png/gif界面图、ppt演示文稿以及mdf/ldf数据库文件为主另外还有配置文件、备份与可执行jar包便于直接导入工程并对照论文梳理实现逻辑。目前已有46人学习下载后可用于毕业设计参考、功能二次开发或论文配图整理。1. 为什么推荐这个企业报销管理系统源码不是又一个“图书管理”Java 毕业设计最不缺的是图书商城、秒杀系统、博客论坛真正到答辩现场被老师追问“业务流程怎么闭合”时带审批流的项目反而更稳。这个企业报销管理系统 .zip 拆开后有 Java 源代码、论文初稿和 PPT 模板底层是 Client/Server 两层结构数据库使用 SQL Server 2000业务一次覆盖报销、审批、公文流转、公告发布、资料维护和个人电话簿。选题评分看重业务闭环这个项目恰好闭环完整。适合两类人一是要交毕设但时间紧想直接改源码而不是从零造轮子的毕业生二是工作中接到老 OA 系统维护想找一套离线可跑的参照。下面的内容会从压缩包里的类名开始一步步把它弄到本地跑起来再告诉你这些坑我都踩过。2. 拆压缩包从类名认出整套系统的骨架拿到 zip 先别急着双击运行第一步是解压到纯英文路径然后看文件清单。这类老项目没有 README却有大量.java.bak和.class文件反而能把系统结构暴露得很清楚。2.1 zip 里到底装了什么三个组成部分与文件命名规律从资源描述能看到压缩包由源码、论文、PPT 模板三部分组成。论文和 PPT 打开后先改封面、目录和致谢源代码文件夹里则是一堆拼音命名的 Java 类。文件名最有价值几乎把业务模块写在了脸上。文件/类名推断职责对应业务ZhuFrame.java.bak/ZhuFrame.class主窗体系统登录后的导航容器全局框架DengLu.class登录窗口与登录校验安全入口ZhuCe.class新用户注册窗口用户管理ZiLiao.class/ZiLiaoXiuGai.class资料列表与资料修改日常工作/资料管理BuMenXiuGai.class部门信息维护组织机构ZhiYuanZiLiaoXiuGai.class职员资料维护人事信息ZuXiuGai.class权限组/用户组维护权限角色Record.class记录封装多用于列表数据模型通用支撑注意.java.bak是作者留给自己的后悔药改动主窗体前先备份最后又把备份一起打包发了出来。.class是编译好的中间产物但拿到新机器上不一定直接能跑因为编译器版本、依赖路径都变了。我的习惯是只看.bak和同名的.java不要迷信.class。ZhuFrame.java.bak要复现时先复制一份改名成ZhuFrame.java再放到源码目录里编译。2.2 六个业务子系统的功能边界与对应类这套系统虽然叫“企业报销管理系统”但摘要里写得更准确它是一个企业 OA 框架报销只是其中一条主流程。登录主窗体后六个子系统通过ZhuFrame的导航菜单进入。子系统功能点在代码里的落点个人工作电话簿、总经理工作计划主窗体个人页电话簿做增删改查信息中心电子公告、规章制度、新闻信息公告列表、正文详情窗口日常工作资料管理、办公用品申领ZiLiao、ZiLiaoXiuGai等资料类流转中心收发文管理、流转、批阅、归档公文状态流转报销单据走同一条链路维护中心组织机构、权限角色定义BuMenXiuGai、ZuXiuGai系统入口登录、注册DengLu、ZhuCe这套划分很聪明论文里可以直接借用这个子系统结构来做功能需求图和数据流图。比起自己临时拍脑袋想模块这种枚举式的功能清单更适合画用例图让答辩 PPT 第一眼就显得业务完整。2.3 为什么选这个老架构当毕设C/S 与 SQL Server 2000 的利弊不要一看到 SQL Server 2000 就头大。对毕业设计来说C/S 结构反而容易演示数据库装在自己机器上客户端用 JDBC 直连不需要部署 Tomcat也不涉及前后端跨域。答辩时只要 SQL Server 服务跑着程序一开就能登录出错也只在两层之间排查状态清晰。它的代价是环境兼容。SQL Server 2000 官方支持止步于 Windows Server 2003 时代在 Win10/Win11 家庭版上安装经常报错常见做法是装虚拟机或者用 SQL Server 2005/2008 的兼容模式替代。如果你是冲着能跑、能改、能答辩去这条路完全够用如果追求高并发、分布式、微服务这份资源就不是你的菜。3. 让老系统跑起来JDK 8 数据库 驱动三件套老项目跑不起来八成不是源码问题而是运行环境不对。按照“JDK → 数据库 → JDBC 驱动”的顺序来每一步用命令验证半小时内能让登录窗口亮出来。3.1 安装 JDK 并配置环境变量先解决“java 不是内部或外部命令”我建议装 JDK 8不要装最新的 JDK 17 或 21。理由很简单这套源码使用的是传统 Swing/AWT 客户端技术JDK 8 对老 API 的兼容性最稳高版本 JDK 虽然也能跑但模块化之后反射和 classpath 处理方式变了老代码编译报错概率更高。安装完成后在命令提示符里执行set JAVA_HOMEC:\Program Files\Java\jdk1.8.0_202 set PATH%JAVA_HOME%\bin;%PATH% java -version javac -version如果你希望环境变量永久生效右键“此电脑 → 属性 → 高级系统设置 → 环境变量”在系统变量里新建JAVA_HOME再在Path里追加%JAVA_HOME%\bin。关掉命令提示符重新打开java -version输出带jdk1.8.0_202就说明环境变量配置成功。对新手来说最容易翻车的一点是配置完环境变量后仍然在原来那个命令行窗口里测试。Windows 的环境变量不会实时刷新已经打开的老窗口必须新开一个命令提示符。我在这个环节卡过一下午后来固定成习惯配置完先exit一次再重开窗口。3.2 准备数据库SQL Server 2000 的安装与还原SQL Server 2000 只靠图形界面装起来也简单关键是装完后要把登录模式改成“混合验证模式”否则客户端永远连不上。企业管理器里右键实例选“属性”切到“安全性”把身份验证改成“SQL Server 和 Windows”然后设置sa密码。如果压缩包里带了.bak数据库备份可以用还原命令加载。以数据库名为ZhuFrame举例RESTORE DATABASE ZhuFrame FROM DISK C:\ERP\data\ZhuFrame.bak WITH MOVE ZhuFrame TO C:\Program Files\Microsoft SQL Server\MSSQL\data\ZhuFrame.mdf, MOVE ZhuFrame_log TO C:\Program Files\Microsoft SQL Server\MSSQL\data\ZhuFrame_log.ldf这段命令里的物理文件名不一定与你拿到的一致SQL Server 会提示“无法在 sysaltfiles 中找到逻辑文件名”到时候打开RESTORE FILELISTONLY FROM DISK ...看一眼实际逻辑名替换即可。如果没有.bak而只有一个create.sql直接用查询分析器执行建库建表脚本再把系统管理员账号插进去。数据库起来后还要确认 SQL Server 服务监听的端口是 1433。SQL Server 2000 默认监听端口通常没问题但命名实例或安装了多个实例时客户端就找不到。用netstat -ano | findstr 1433看一眼如果没监听到“服务器网络实用工具”里启用 TCP/IP重启服务。3.3 编译与启动用 -encoding GBK 护卫中文这是整套源码最容易报编码错误的地方。很多老项目的源文件是 GBK 编码而现代 JDK 默认按 UTF-8 读源码直接javac编译出来的中文全是乱码甚至报“编码 GBK 的不可映射字符”。正确的编译命令是cd C:\ERP\src javac -encoding GBK -cp .;lib\msbase.jar;lib\mssqlserver.jar;lib\msutil.jar -d out *.java java -cp out;lib\msbase.jar;lib\mssqlserver.jar;lib\msutil.jar ZhuFrame第一行-encoding GBK让编译器和你的源码编码一致。第二行-cp后面带的三个 jar 是微软 SQL Server 2000 JDBC 驱动的常用组件缺了任何一个都会在运行时抛出ClassNotFoundException。-d out指定编译输出目录避免把.class和.java混在一起。启动也建议用命令行而不是双击.class。双击文件执行时看不到控制台报错一旦数据库连不上只会闪一下你根本不知道问题在驱动还是端口。命令行启动后所有异常都会堆在终端里排查效率高得多。第一次登录先用sa和刚才设置的密码如果登录窗口允许注册也可以先用ZhuCe.class的功能注册一个普通账号再登。4. 代码里的关键实现从登录校验到公文流转状态链源码里大量使用直接拼 SQL 的写法风格很老旧但逻辑链路反而直白。看懂三张核心表和一条状态流转链就掌握了这个系统的七成。4.1 登录注册与权限控制DengLu 类背后的用户表设计登录功能永远是整个系统的第一个入口。DengLu.class做的事情其实是三个动作接收输入、查表比对、写 Session。老项目没有 Spring Security也没有 JWT它靠的就是数据库里一张用户表和角色表。以常见设计为例CREATE TABLE yg_user ( user_id INT IDENTITY(1,1) PRIMARY KEY, account VARCHAR(20) NOT NULL, password VARCHAR(50) NOT NULL, user_name NVARCHAR(20), role_id INT ); CREATE TABLE yg_role ( role_id INT PRIMARY KEY, role_name NVARCHAR(20), perm_level INT ); INSERT INTO yg_role VALUES (1, N系统管理员, 9); INSERT INTO yg_role VALUES (2, N普通员工, 1);DengLu类的校验逻辑通常就是拿account和password去查yg_user查得到就跳转ZhuFrame查不到就弹错误框。注意这张用户表里密码是明文放到答辩时老师可能问你“密码安全性怎么改进”这是一个送分题改成 MD5 或 SHA-256 加盐存储然后说这是自己做的增强。ZhuCe.class的注册逻辑如果没经过维护中心审核很可能注册出来就是普通员工权限这正是你需要在论文里写清楚的一点注册只做基础信息录入真正的角色分配在维护中心由管理员完成。4.2 信息发布与日常办公的表结构公告、资料、办公用品申请信息中心是单位内部发布公告、规章制度和新闻的平台。这类内容型功能在 SQL Server 2000 下的标配表结构可以参照下面这段CREATE TABLE t_notice ( notice_id INT IDENTITY PRIMARY KEY, title NVARCHAR(100), content NTEXT, publish_user NVARCHAR(20), publish_time DATETIME, is_top INT DEFAULT 0 );publish_time用DEFAULT GETDATE()维护发布时刻is_top控制置顶查列表时ORDER BY is_top DESC, publish_time DESC这就是公告排序的实现细节。日常工作模块还有办公用品申领它是一张典型的流程单据表CREATE TABLE t_apply ( apply_id INT IDENTITY PRIMARY KEY, user_id INT, item_name NVARCHAR(50), item_count INT, apply_date DATETIME, status VARCHAR(10) DEFAULT N待批 );状态只有几个固定值待批、已批、已领、驳回。界面上每做一次操作就执行一次UPDATE t_apply SET status ? WHERE apply_id ?。它不是多高级的设计但胜在直观改起来几乎不用动脑。4.3 公文流转把报销审批做成一条状态机真正的核心在流转中心。收发文、报销单、办公用品申领其实走的都是同一条审批链。这类流程型模块不宜把状态写死在一个字段里适合用两张表一张存当前单据走到哪个节点一张存每个节点的操作日志。CREATE TABLE t_doc_flow ( flow_id INT IDENTITY PRIMARY KEY, doc_type VARCHAR(20), doc_title NVARCHAR(100), cur_node INT, from_user NVARCHAR(20), apply_time DATETIME, remark NTEXT ); CREATE TABLE t_flow_log ( log_id INT IDENTITY PRIMARY KEY, flow_id INT, node INT, action_user NVARCHAR(20), action_name NVARCHAR(20), action_time DATETIME );cur_node表示当前节点例如 1 是草稿2 是部门审批3 是财务审批4 是归档。业务层做“送审”或“批复”时会同时更新t_doc_flow.cur_node和向t_flow_log插入一条日志。代码里对应的常用做法是这样public boolean moveToNext(int flowId, int newNode, String user, String action) { Connection conn getConnection(); try { conn.setAutoCommit(false); PreparedStatement ps conn.prepareStatement( UPDATE t_doc_flow SET cur_node? WHERE flow_id?); ps.setInt(1, newNode); ps.setInt(2, flowId); ps.executeUpdate(); PreparedStatement psLog conn.prepareStatement( INSERT INTO t_flow_log(flow_id, node, action_user, action_name, action_time) VALUES (?,?,?,?,GETDATE())); psLog.setInt(1, flowId); psLog.setInt(2, newNode); psLog.setString(3, user); psLog.setString(4, action); psLog.executeUpdate(); conn.commit(); return true; } catch (SQLException e) { conn.rollback(); return false; } finally { conn.close(); } }注意这里用conn.setAutoCommit(false)和commit/rollback保证状态更新和日志插入要么全部成功要么全部回滚。很多毕设源码不写事务一旦第二步日志插入失败单据状态变了但查不到操作记录答辩时这就是个明显的低级设计缺陷。你拿到这份代码后把事务补上是第一个值得写进论文的改进点。5. 避坑手册SQL Server 2000 连接失败、编码乱码、JDBC 驱动缺失这一章是我最想写的部分。老项目的坑不在业务逻辑而在环境适配。这里列五条我亲测过的典型问题每条都按“现象 → 原因 → 解决”展开照着排查能少走很多弯路。5.1 ClassNotFoundExceptionJDBC 驱动到底该放哪里现象运行java ZhuFrame后控制台抛java.lang.ClassNotFoundException: com.microsoft.jdbc.sqlserver.SQLServerDriver。原因源码编译能通过但运行时classpath里没有微软 SQL Server 2000 的 JDBC 驱动。这种情况常见于直接把源码拷到新机器少了lib目录下三个 jar。解决把msbase.jar、mssqlserver.jar、msutil.jar拷贝到项目lib目录并在启动命令中加入-cp指定它们。如果你拿到的是新一点的 SQL Server也可以换用 JTDS 驱动只需要把连接 URL 改成jdbc:jtds:sqlserver://localhost:1433/ZhuFrame加载的类名变成net.sourceforge.jtds.jdbc.Driver。这是替代旧微软驱动最省事的方式。5.2 sa 登录失败只有 Windows 身份认证现象登录窗口输入sa和密码提示“用户 sa 登录失败”但 SQL Server 企业管理器又可以正常打开。原因SQL Server 2000 实例被设置成了仅 Windows 身份认证sa账号不允许通过 TCP 连接进来。另一个常见原因是sa密码为空很多版本的 JDBC 驱动默认不允许空密码。解决在企业管理器里把实例属性改成“混合验证模式”然后给sa设置一个非空密码重启 SQL Server 服务。如果要走命令行也可以直接执行注册表修改EXEC xp_instance_regwrite NHKEY_LOCAL_MACHINE, NSoftware\Microsoft\MSSQLServer\MSSQLServer, NLoginMode, REG_DWORD, 2执行完之后到服务管理器里重启 MSSQLSERVER 服务。记住LoginMode2表示混合模式改完必须重启才生效。5.3 中文乱码菜单、按钮全是“”或方块现象编译运行后ZhuFrame主界面标题、按钮中文全部变成问号或“鎴愬姛”这类奇怪文字。原因源文件是 GBK 编码但javac默认按 UTF-8 解码造成中文字节被错误解析也可能是运行时 JVM 的file.encoding不正确。解决编译命令加-encoding GBK运行时加-Dfile.encodingGBK。如果使用 IDE还要在项目设置里把源文件编码改为 GBK。具体命令是chcp 936 javac -encoding GBK -cp .;lib\msbase.jar;lib\mssqlserver.jar;lib\msutil.jar -d out *.java java -Dfile.encodingGBK -cp out;lib\msbase.jar;lib\mssqlserver.jar;lib\msutil.jar ZhuFramechcp 936是把控制台代码页切到简体中文防止 log 信息本身乱码-Dfile.encodingGBK让读入的数据库中文也按 GBK 解释。如果数据库字段是NVARCHAR类型乱码通常就不会出现因为驱动会采用 Unicode 传输。5.4 双击 .class 秒退控制台没报错机会现象在资源管理器里双击ZhuFrame.class屏幕闪一下程序就没了或者打包成 jar 后双击同样闪退。原因双击执行本质上是javaw.exe它不启动控制台任何异常都只写在隐藏窗口里用户根本看不到。更关键的是双击时当前工作目录不一定是项目根目录lib下的驱动加载不到数据库连接一错就崩。解决不要双击改成命令行启动。先在cmd里手动切到项目根目录再执行java -cp out;lib\... ZhuFrame让异常在终端里显示出来。如果确实想双击 jar 使用需要写一个.bat启动脚本并在脚本里cd /d %~dp0固定工作目录再调用java -jar。5.5 连接超时SQL Server 2000 的 TCP/IP 端口没开现象程序能启动登录窗口也能弹出但点登录后卡住最后报“连接超时”或“无法打开到主机的连接”。原因SQL Server 2000 默认可能没有启用 TCP/IP或当前实例是命名实例客户端还在用localhost去连不存在的默认实例端口。解决在“服务器网络实用工具”里启用 TCP/IP确认端口是 1433然后重启 SQL Server 服务。命令行验证端口的方法netstat -ano | findstr 1433如果看到LISTENING就说明端口通了。再用 PowerShell 的Test-NetConnection localhost -Port 1433测试连接显示TcpTestSucceeded : True就可以把问题定位在账号上而不是网络层。6. 跑通之后怎么验收五个最小验证动作与个性化改造源码跑起来只是第一步答辩前一定要按业务流完整走一遍确认所有子系统真的联动而不是只停留在登录界面。我自己验收时会固定做五个动作注册一个新账号退出后用新账号重新登录确认ZhuCe和DengLu的注册登录闭环成立。到维护中心新增一个部门再给用户分配角色回主界面刷新看组织机构变化。在信息中心发布一条带中文和标点的公告重进列表确认标题排序、发布时间正常。走一次办公用品申领提交申请 → 管理员批准 → 领取 → 关闭流程全程看t_apply状态字段更新。走一次报销公文流转新建单据 → 送审 → 部门审批 → 财务审批 → 归档打开t_flow_log能看到每一步操作日志。如果五个动作都通过系统和论文里的架构图就对上了。接下来是做个性化改造。一个低成本但见效快的做法是给类改名把ZhuFrame.java.bak复制出来改成MainFrame.java把类名ZhuFrame统一替换成MainFrame再重新编译。这个动作很小但能在代码答辩时直接说“我在源码基础上重构了主类命名”比只改论文封面可信得多。具体到代码可以顺手加一点防御性校验。老代码通常会直接执行Statement stmt conn.createStatement(); ResultSet rs stmt.executeQuery(sql);我一般会改成PreparedStatement预编译同时把 SQL 语句打印到控制台PreparedStatement ps conn.prepareStatement(sql); ps.setString(1, account); ps.setString(2, password); ResultSet rs ps.executeQuery(); System.out.println(执行查询账号: account);这一处修改能同时封印两个问题SQL 注入隐患和排查时看不到上下文。你甚至不需要改全部代码只改登录和公文流转两处论文里写“安全性增强与日志审计”就够了。从那以后我拿到任何源码包都强制自己先解压到纯英文目录先看.bak再动源码跑不起来绝不先改业务。这套老项目虽然技术栈看着旧但业务链路比很多空有界面的新项目完整得多把环境配好、把表结构看懂它就是一套能落地、能答辩、能二次开发的现成骨架。希望这篇拆解能帮到你。本文还有配套的精品资源点击获取