简介: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.gz | H5前端静态包,解压后交给Nginx托管 | Nginx的root目录 |
| app.apk | 安卓端安装包 | 手机端离线安装 |
| nginx-1.24.0.tar.gz | Nginx 1.24.0,站点入口和反向代理 | Windows/Linux皆可 |
| diffdb.jar | 数据库结构初始化与差异同步工具 | 仅部署/升级时运行 |
| startup.bat / reboot.bat | Windows环境一键启动、重启脚本 | 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.exe,Linux下编译安装或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默认字符集是utf8mb4,5.7环境需要显式带上去。
2.3 启动顺序:先数据库、再后端、再前端
启动顺序我踩过坑,正确顺序是:先初始化数据库,再启动后端Jar,最后配Nginx。后端启动前要确认数据库连接参数。
如果是Windows服务器,startup.bat里已经写好了基础参数,但默认的数据库地址、端口、账号密码大概率要改。我一般把JVM内存和数据库连接显式写进去:
@echo off set JAVA_HOME=D:\jdk1.8 set PORT=8080 set DB_URL=jdbc:mysql://127.0.0.1:3306/eam?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai set DB_USER=root set DB_PASS=your_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:连接串里必须带serverTimezone=Asia/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 --mode=init ^ --url=jdbc:mysql://127.0.0.1:3306/eam?useUnicode=true&characterEncoding=utf8 ^ --username=root --password=your_password # 升级模式,对比后输出差异SQL,不直接执行 java -jar diffdb.jar --mode=diff ^ --url=jdbc:mysql://127.0.0.1:3306/eam?useUnicode=true&characterEncoding=utf8 ^ --username=root --password=your_password ^ --output=upgrade.sql参数说明:
--mode=init:初始化模式,只在空库上跑。跑第二次会重复建表,虽然一般有IF NOT EXISTS保护,但不要赌--mode=diff:差异模式,生成升级SQL但不执行。这个设计很稳,让DBA人工审查后再执行--output=upgrade.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 50m:Excel导入时文件可能到二三十M,默认1M限制不够,直接报413proxy_pass http://127.0.0.1:8080:注意后端地址不要暴露到公网,监听内网即可try_files $uri $uri/ /index.html:H5用到了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;"后端返回200,Nginx返回200,数据库表数量在预期范围内,说明基础环境没问题。接着打开浏览器登录系统,创建一个测试用户,拿这个账号走一遍流程:新增一台资产 → 申请报修 → 派单处理 → 验收关闭 → 调拨给另一个部门 → 确认接收。走完这步,资产的状态、部门归属、维修记录、调拨记录都有数了,再去看统计报表就能对得上数。
我会特意检查数据权限有没有生效:用普通账号登录,看他能不能看到其他部门的资产。这一步被很多人忽略,等到业务部门投诉“资产数据泄露”才回来补配置,那时候信任成本已经产生了。从那以后我每次部署完成都会强制走一遍这个验证清单,权限配置再花五分钟也不嫌多。数据权限表单的配置动作必须在正式交付前做,不要在业务已经录入大量资产后再调整。希望这份部署和排查笔记帮到你,遇到具体报错欢迎对照对应章节定位处理。
本文还有配套的精品资源,点击获取