简介EAM固定资产设备管理系统是面向中小企业资产全生命周期管理的企业级应用资源资产登记、维修调拨、耗材库存、采购合同、文档管理、运维服务与数据中心设备管理等多模块均有覆盖支持自定义设备类型与导入导出并配有较完善的组织架构适合IT运维、实施工程师及Java开发人员学习参考。压缩包共7178个文件、约77.46MB以3785个Java文件承载后端业务逻辑826个HTML、1316个JS和351个CSS构成前端界面另有54个SQL初始化脚本、37个XML配置及shell、YAML、Dockerfile等部署运维文件并含移动端APK、Nginx配置与启停脚本可整体搭建运行。已有511人学习下载。整体呈现EAM系统的前后端实现、数据库脚本与部署要素为二次开发、功能选型与系统部署提供了可直接落地的项目基线目录划分覆盖前端、后端、配置、脚本与移动端便于按模块快速定位研究。1. EAM固定资产管理系统中小企业资产全生命周期管理一台服务器就能跑起来一说到EAM固定资产管理系统不少中小企业的第一反应是“资产台账而已Excel也能干”。真去实施过的人会明白Excel只能记个数管不住一台设备的调拨轨迹、维修记录、耗材消耗和合同到期日。这套EAM固定资产设备管理系统是个能直接部署的私有化方案后端用Java打包成ops.jar前端有H5网页包和安卓App自带Nginx 1.24.0和数据库初始化工具覆盖资产登记、维修、调拨、转移、耗材库存、采购、文档、合同、数据中心设备管理。它不是那种大而全的集团级资产系统而是正好卡在中小企业的管理痛点上一个运维人员半天能装完业务人员按表单操作就能把设备全生命周期管起来。我拆过不少资产系统这套的部署结构适合想快速落地、又不想被云厂商绑定的团队。2. 部署包构成与启动逻辑ops.jar、h5.tar.gz、app.apk之间是怎么配合的2.1 先从文件名看懂这套系统部署包拿到的是一堆带序号后缀的文件比如ops.jar.1、h5.tar.gz.1、diffdb.jar.1、nginx-1.24.0.tar.gz.1。这是下载平台常见的情况文件到了本地把.1去掉再用就行不影响内容。文件实际角色部署位置ops.jar后端服务主程序Spring Boot风格的可执行Jar应用服务器占用8080端口h5.tar.gzH5前端静态包解压后交给Nginx托管Nginx的root目录app.apk安卓端安装包手机端离线安装nginx-1.24.0.tar.gzNginx 1.24.0站点入口和反向代理Windows/Linux皆可diffdb.jar数据库结构初始化与差异同步工具仅部署/升级时运行startup.bat / reboot.batWindows环境一键启动、重启脚本Windows服务器asset_data_permissions_form.html.code资产数据权限配置表单页面前端静态资源并入H5包这里有个容易误判的点ops.jar就是后端全部不需要再装Tomcat。Spring Boot内嵌了Web容器。Nginx只承担静态文件托管和API反向代理真正处理业务逻辑的是ops.jar。2.2 部署前准备JDK、MySQL、Nginx这套系统的运行环境不挑硬件2核4G的机器跑中小企业几百台设备绰绰有余。我一般这样准备JDK 1.8以上注意64位版本要和ops.jar匹配MySQL 5.7或8.0字符集用utf8mb4避免资产名称里的特殊字符乱码Nginx 1.24.0解压即可Windows下直接跑nginx.exeLinux下编译安装或apt install都行数据库需要提前建一个空库。我习惯先建库、再跑diffdb.jar初始化表结构顺序反了会报“表不存在”或者“连接拒绝”。# 创建数据库字符集必须是utf8mb4 mysql -uroot -p -e CREATE DATABASE eam DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; # 检查JDK版本 java -version # 解压后端包带序号先改名 mv ops.jar.1 ops.jar建库这一步看起来简单但字符集不指定后面导入Excel中文必乱。MySQL 8.0默认字符集是utf8mb45.7环境需要显式带上去。2.3 启动顺序先数据库、再后端、再前端启动顺序我踩过坑正确顺序是先初始化数据库再启动后端Jar最后配Nginx。后端启动前要确认数据库连接参数。如果是Windows服务器startup.bat里已经写好了基础参数但默认的数据库地址、端口、账号密码大概率要改。我一般把JVM内存和数据库连接显式写进去echo off set JAVA_HOMED:\jdk1.8 set PORT8080 set DB_URLjdbc:mysql://127.0.0.1:3306/eam?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghai set DB_USERroot set DB_PASSyour_password java -Xms512m -Xmx1024m -jar ops.jar ^ --server.port%PORT% ^ --spring.datasource.url%DB_URL% ^ --spring.datasource.username%DB_USER% ^ --spring.datasource.password%DB_PASS%参数说明-Xms512m -Xmx1024m初始堆512M最大堆1G。资产数据量大时不够再加我自己管过三千台设备的库1G够用--server.port后端HTTP端口默认8080。如果8080被占用改成8081后Nginx代理地址要同步改--spring.datasource.url连接串里必须带serverTimezoneAsia/Shanghai否则MySQL 8.0在JVM默认时区下会报时区错误--spring.datasource.password密码里有特殊字符记得用IDEA或命令行工具转义启动后看到“Started Application”日志说明后端起来了。前端包解压到Nginx的html/eam目录直接用Nginx托管。H5包不需要node环境也不需要编译解压就是静态文件。3. 核心功能模块拆解从资产登记、维修调拨到耗材库存3.1 资产类型自定义不要被内置分类绑死系统内置了“电脑、服务器、办公设备、数据中心设备”这类通用分类但真正用到项目里会发现每个企业的资产颗粒度不一样。有的企业要把“配电柜”单独成类有的要按“机房机柜U位”管理服务器。这套系统支持自定义资产类型核心思路是“类型表定义分类自定义字段表定义属性”。在后台找到“资产类型管理”新增一个类型然后给这个类型挂自定义字段字段类型支持文本、数字、下拉、日期这几类。我一般建议资产类型控制在两级一级是“电子设备、办公家具、数据中心设备”二级才是“笔记本、显示器、服务器、机柜”。分类太深会导致后面做统计报表时维度爆炸。字段设计上资产编号、资产名称、所属部门、存放位置、责任人这几个是必选其他按业务需求加。3.2 维修、调拨、转移的状态流转逻辑资产的维修不是简单记一笔而是走工单流程。系统里维修单的状态一般是这样流转的报修登记 → 派单 → 维修处理 → 验收关闭实际使用中维修单的核心字段是资产编号、故障描述、维修类型保修/自修/外修、费用、开始时间、结束时间、维修结果。这里的“费用”字段直接决定维护成本统计报表的准确性。调拨和转移是资产权限变动的核心操作。调拨单需要选择调出部门、调入部门和接收人流程是“申请 → 审批 → 确认接收”。注意最后一步“确认接收”必须做否则库存数据和资产归属不会变。转移则是同一部门内位置变化不需要走审批只留位置变更记录。完成一个调拨动作后建议去资产列表看两条数据调出方资产状态是否变成“已调出”调入方资产是否已经带出新部门和负责人。这两条对不上就是流程没走完。3.3 导入导出与Excel模板的字段对应第一次上线最耗时间的不是装系统而是把Excel里的存量资产导进去。系统自带的导入功能支持资产基础信息、部门、耗材三类数据的批量导入。模板下载下来后第一行是字段名第二行开始是数据。这里有一个高频坑模板里的“所属部门”默认填部门名称如果系统里部门树是“研发一部”这种名称Excel里就必须严格一致。导入前先在系统里导出一份部门列表对照比报错了再改效率高得多。导入校验逻辑一般是资产编号为空跳过资产编号重复覆盖更新其余字段按类型校验。我习惯分小批导每次200行导完看错误报告。系统返回的错误会标出具体行号和原因比猜快太多。导出功能就简单了资产列表筛选条件设好点导出就是全部字段的Excel。做维修费用统计、折旧报表都靠这个入口。3.4 耗材库存与数据中心设备管理耗材库存是容易被忽略但实际使用频率最高的模块。打印机墨盒、网线、水晶头、键盘鼠标这些不纳入固定资产但少了它们设备维修寸步难行。系统按“耗材类型 仓库 库存数量”管理入库、出库都会生成流水低于安全库存时列表会有预警标记。数据中心设备管理比较特殊需要记录IP地址、机柜位置、U位、电源功率、上架日期。系统里每个数据中心设备可以作为独立资产登记同时把它的子设备比如服务器里的板卡挂到主设备下。我操作的时候习惯把资产编号和IP一一对应后面做巡检时直接拿IP反查资产省去翻台账的时间。4. 数据权限与运行参数diffdb.jar、nginx反向代理和权限表单4.1 diffdb.jar的两种用法初始化建表和升级同步diffdb.jar这台系统的关键工具第一次见容易一头雾水。它做的是数据库表结构和基础数据的初始化与差异比对。第一次部署时数据库是空库用init模式建全部表后续版本升级时用diff模式对比新旧结构自动补字段、建索引。# 初始化模式空库执行完后会生成完整的表结构 java -jar diffdb.jar --modeinit ^ --urljdbc:mysql://127.0.0.1:3306/eam?useUnicodetruecharacterEncodingutf8 ^ --usernameroot --passwordyour_password # 升级模式对比后输出差异SQL不直接执行 java -jar diffdb.jar --modediff ^ --urljdbc:mysql://127.0.0.1:3306/eam?useUnicodetruecharacterEncodingutf8 ^ --usernameroot --passwordyour_password ^ --outputupgrade.sql参数说明--modeinit初始化模式只在空库上跑。跑第二次会重复建表虽然一般有IF NOT EXISTS保护但不要赌--modediff差异模式生成升级SQL但不执行。这个设计很稳让DBA人工审查后再执行--outputupgrade.sql指定差异SQL输出文件不指定则打印到控制台我升级时习惯先把upgrade.sql在测试库执行一遍确认没有破坏现有数据再上生产。这个步骤不能省跳过出问题恢复起来很被动。4.2 资产数据权限表单按组织架构控制可见性asset_data_permissions_form.html.code这个文件是资产数据权限表单的前端代码对应后端数据权限配置接口。它的核心作用是解决“分公司之间资产数据互相看得到”的问题。中小企业的组织架构一般是总公司 → 部门 → 小组。数据权限配置的逻辑是用户属于哪个部门节点就能看到该节点及其下级节点的资产数据。表单上可配置项包括用户ID、数据范围本部门/本部门及下级/全部、资产类型过滤、字段掩码。实际配置步骤是先建用户勾选所属部门再进入数据权限表单给该用户分配“本部门及下级”范围。配置完成后这个用户登录系统资产列表只能出他权限范围内的数据。做跨部门盘点时再临时把范围调成“全部”。4.3 nginx站点配置和前后端联调参数Nginx在这里承担静态资源托管和API反向代理。前端H5包放在root目录所有/api/的请求转发给op.jar的8080端口。server { listen 80; server_name eam.example.com; root /usr/share/nginx/html/eam; index index.html; client_max_body_size 50m; location /api/ { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } location / { try_files $uri $uri/ /index.html; } }参数说明client_max_body_size 50mExcel导入时文件可能到二三十M默认1M限制不够直接报413proxy_pass http://127.0.0.1:8080注意后端地址不要暴露到公网监听内网即可try_files $uri $uri/ /index.htmlH5用到了history路由必须加这条否则刷新页面就404前后端联调时最常改的是API地址。如果后端改了端口或部署在不同机器Nginx里只改proxy_pass这一行前端不用动。5. 常见问题排查部署、数据导入、数据权限的五类踩坑记录5.1 Nginx启动“成功”但页面打不开现象Windows下双击nginx.exe进程假死浏览器访问localhost显示无法连接。原因80端口被IIS或者其他服务占用nginx.exe没有真正启动成功但不报错弹窗。解决命令行进入Nginx目录执行nginx -t检查配置再执行netstat -ano | findstr :80看端口占用。找到占用PID后要么停掉占用进程要么把nginx的listen端口改成8088。改端口后记得配一份安全组规则别让谁都访问。5.2 资产导入后部门为空现象Excel导入显示成功但资产列表里“所属部门”是空的。原因Excel模板里的部门名称和组织架构树里实际存的不一致。比如系统里是“研发二部”Excel里填了“研发2部”后台按名称匹配不到就落空。解决先到组织架构管理里下载部门列表用列表里的部门名称填Excel。如果系统支持部门编码优先填编码编码是唯一值匹配更稳定。导入后抽几条记录复查不是看导入结果数量就完事。5.3 调拨单审批后资产归属没变现象调拨流程在系统里已经结束但资产列表里这台设备的所属部门还是调出部门。原因调拨单最后一步“确认接收”没做。审批完成只代表调出方同意接收方确认后才触发资产归属变更。解决去调拨单列表找到这张单检查当前状态。如果停在“审批通过”而不是“已完成”让接收人登录系统点“确认接收”。之前项目上出现过这类问题原因是接收人没账号后来给接收人开完账号补点确认就好了。如果确认后资产归属还没变检查该账号的数据权限范围是不是覆盖了该资产。5.4 App连不上服务器现象安卓App装好后打开一直加载中过会儿提示网络异常。原因App里配置的API地址指向的是服务器内网IP手机在外网访问不到。或者服务器防火墙没有放行对应端口。解决找到App配置文件里的API地址改成服务器公网IP或域名。改完重新打包。如果不想重新打包看服务端有没有配置中心或H5端入口App是H5壳子的话直接改前端配置更省事。防火墙规则单独放行80或443再把MySQL的3306端口限定内网访问不要在防火墙里直接放行数据库端口。5.5 自定义字段上线后导入模板不识别现象后台新增了“采购日期”这个自定义字段导入时Excel模板里没有这一列或者有这一列但导入失败。原因导入模板是新增字段之前下载的模板结构没有包含新字段。解决重新下载导入模板用新模板填数。Excel里自定义字段的列名要与后台字段名一致多一列少一列都会影响校验。做导入前养成习惯先下载最新模板再填数不要拿旧模板直接改。6. 部署完成后的一小时验证清单从登录到走通第一个维修工单系统装完别急着把账号扔给业务人员先花一小时把核心链路验证一遍。我会按这个顺序跑# 1. 验证后端服务存活 curl -s -o /dev/null -w %{http_code} http://127.0.0.1:8080/api/health # 2. 验证Nginx静态资源 curl -I http://127.0.0.1/ # 3. 数据库连接和数据量检查 mysql -ueam -p -e USE eam; SHOW TABLES; SELECT COUNT(*) FROM asset_main;后端返回200Nginx返回200数据库表数量在预期范围内说明基础环境没问题。接着打开浏览器登录系统创建一个测试用户拿这个账号走一遍流程新增一台资产 → 申请报修 → 派单处理 → 验收关闭 → 调拨给另一个部门 → 确认接收。走完这步资产的状态、部门归属、维修记录、调拨记录都有数了再去看统计报表就能对得上数。我会特意检查数据权限有没有生效用普通账号登录看他能不能看到其他部门的资产。这一步被很多人忽略等到业务部门投诉“资产数据泄露”才回来补配置那时候信任成本已经产生了。从那以后我每次部署完成都会强制走一遍这个验证清单权限配置再花五分钟也不嫌多。数据权限表单的配置动作必须在正式交付前做不要在业务已经录入大量资产后再调整。希望这份部署和排查笔记帮到你遇到具体报错欢迎对照对应章节定位处理。本文还有配套的精品资源点击获取
