ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Foxnic-EAM:Java开源固定资产全生命周期管理系统部署实践

Foxnic-EAM:Java开源固定资产全生命周期管理系统部署实践 简介Foxnic-EAM固定设备资产管理系统是一套面向中小企业设备信息化管理的完整Java Web解决方案覆盖资产登记、维修、调拨、转移、耗材与库存管理、采购管理、合同管理、文档管理、运维服务与数据中心设备管理等业务模块并内置灵活的自定义扩展能力。压缩包含2000个文件以1317个Java源码、361个JS脚本、225个HTML页面为主辅以SQL初始化脚本、Shell部署脚本、XML配置、DOCX说明文档与PDF手册等整体约144MB目录结构完整便于二次开发与部署学习。系统内置组织架构与权限体系适合需要规范化管理固定资产、提升运维效率的中小企业技术人员目前已有541人浏览学习。借助源码、文档与配置文件读者可快速掌握EAM核心设计思路借鉴资产全生命周期管理、维护工作统计、导入导出与报表等实现方案并可直接基于业务模块进行功能扩展。项目基于模块化设计二次开发门槛较低适合已有Java基础的技术人员在中小企业信息化项目中使用。1. 固定设备台账在Excel里烂掉之后Foxnic-EAM到底补上什么大多数公司谈固定资产管理实际是一张几万行的Excel台账配一个网盘里的领用登记表。设备少的时候还好设备一旦过百问题立刻冒出来这台笔记本电脑到底在谁手里上个月的盘点差异为什么对不上报废审批卡在哪个环节Foxnic-EAM固定设备资产管理系统正是一套用Java技术栈做出来的开源系统把固定设备从申购入库、领用归还、维修保养到盘点处置的全生命周期管起来。它能解决的是账实不符、过程无记录、责任说不清这三类最让资产管理员头疼的问题。适合两类人一是公司内部负责IT设备、行政资产、生产设备的运维或IT人员想用一套能自己部署、能改代码的系统替代Excel二是准备做Java二次开发或低代码平台学习的技术人员。下文我会把模块边界、部署步骤、初始化参数和踩坑点一条条讲清楚。2. 认识Foxnic-EAM核心业务模块与技术选型理由2.1 设备全生命周期管理台账、领用、维修、盘点分别解决什么问题Foxnic-EAM的核心不是登记一台设备而是围绕一台固定设备从进到出的完整过程做状态跟踪。六个主要业务模块撑起这个闭环资产台账、领用归还、借用管理、维修保养、盘点管理、处置报废。六个模块解决的是不同环节的账实问题。业务模块解决的问题关键操作资产台账设备底数、状态、存放位置不清楚新建卡片、批量导入、查看变动记录领用/归还设备在谁手上什么时候给的说不清申请人提交领用单资产管理员审批出库借用/归还跨部门临时借用丢失没人管借用单、预计归还日期、超期提醒维修/保养设备故障没人跟、保养没计划维修工单、故障类型、费用登记盘点台账与实物是否一致生成盘点单、扫码盘点、盘盈盘亏处理处置/报废设备退出使用没有审批依据报废审批、处置记录这六个模块里最容易被低估的是资产台账。很多团队以为台账就是谁在用、放哪、多少钱实际上台账还承担了责任链条的起点一次维修工单要挂到资产编号上一次盘点差异要落到具体资产上一次领用审批要关联到使用人。没有台账主数据其余五个模块全是空中楼阁。Foxnic-EAM里台账卡片能记录资产编号、分类、存放地点、当前责任人、购置日期、原值折旧、附件图片这些字段每次发生变动都会追加一条变更记录这一点比Excel的最后保存者可靠得多。领用归还模块则是把线下口头流程变成申请单。以前同事借显示器微信说一声就拿走月底对不上账只能挨个问。上了系统以后领用单至少要被申请人和资产管理员审批两级归还时还要勾选设备状态是否完好超期未还会自动提醒。对于几百台设备的小公司来说这套流程不需要多复杂但留痕这个动作本身就能减少大量扯皮。2.2 为什么选Foxnic-EAM而不是自己写一套框架能力与适用边界Foxnic-EAM之所以叫这个名字是因为它基于Foxnic这一Java元数据应用框架搭建。Foxnic把表单、列表、权限、流程做成引擎Foxnic-EAM的业务代码则围绕资产对象展开。对于要改系统的人来说这意味着不用从零写增删改查改字段、加对象、调流程大多在界面上完成。技术层常见选型作用后端Spring Boot Foxnic框架提供元数据引擎、内置CRUD、权限与流程前端Vue Element UI后台管理界面列表、表单、流程图数据库MySQL业务数据存储用utf8mb4字符集防乱码缓存Redis常用作会话缓存、验证码存储小规模可不配选它的理由有三点。第一是字段可扩展Foxnic的元数据设计允许你在界面上给资产对象加自定义字段不用改表结构再重启服务第二是流程引擎领用、借用、报废这些审批流可以在流程设计器里调整节点和审批人第三是代码生成器业务变了先生成基础CRUD再改逻辑比自己从Controller写到Mapper高效得多。边界也要说清楚。Foxnic-EAM本质是设备管理不是财务固定资产模块的替代品折旧计算一般只有原值、净值和简单的折旧方式做不到财务月末结账级别的精细度移动端扫码盘点通常是在H5页面里做的如果公司要求扫码枪离线采集还需要做二次开发资产标签和二维码打印往往没有预置好需要自己调模板。也就是说选它的时候要默认系统能用但要改的地方也明确如果你们需要一个零开发的开箱即用产品那应该去看商业EAM而不是开源项目。3. 把Foxnic-EAM部署上服务器两种落地方式与最小配置3.1 部署前的资源评估和账号规划Foxnic-EAM是典型Spring Boot单体应用部署压力不大。我一般建议给一台2核4G内存、40G磁盘的云服务器或内网虚拟机操作系统选CentOS 7或Ubuntu 20.04以上的64位发行版数据库用MySQL 8.0字符集统一utf8mb4。这个配置跑几百台设备的资产台账、日常审批和月度盘点完全够用如果并发部门数超过几十个再把Redis和单独的MySQL实例拆出来。部署前先确认发布包形态。Foxnic-EAM的发布包通常有两种一种带Dockerfile和compose文件适合直接拉起容器另一种是纯源码需要自己用Maven打包。拿到包后第一件事是看部署说明文档里对JDK、MySQL、Node的要求不要用你习惯的版本硬套。初始管理员账号一般在初始化说明里写清楚常见的是admin首次登录会被要求改密码这个账号务必改完就不要再给人用后面要建真实管理员账号。3.2 Docker Compose方式配置文件与启动命令容器化部署是最省事的路径尤其是内网服务器上不想装一堆开发环境的时候。一个最小可用的docker-compose.yml长这样version: 3.8 services: mysql: image: mysql:8.0 container_name: foxnic-eam-mysql restart: always environment: MYSQL_ROOT_PASSWORD: Root_123456 MYSQL_DATABASE: foxnic_eam MYSQL_USER: eam MYSQL_PASSWORD: Eam_123456 TZ: Asia/Shanghai command: - --character-set-serverutf8mb4 - --collation-serverutf8mb4_general_ci volumes: - mysql_data:/var/lib/mysql - ./init:/docker-entrypoint-initdb.d ports: - 3306:3306 healthcheck: test: [CMD, mysqladmin, ping, -h, localhost, -uroot, -pRoot_123456] interval: 10s timeout: 5s retries: 10 app: build: . container_name: foxnic-eam-app restart: always depends_on: mysql: condition: service_healthy ports: - 8080:8080 environment: SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/foxnic_eam?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/ShanghaiuseSSLfalseallowPublicKeyRetrievaltrue SPRING_DATASOURCE_USERNAME: eam SPRING_DATASOURCE_PASSWORD: Eam_123456 TZ: Asia/Shanghai volumes: - ./logs:/opt/app/logs volumes: mysql_data:depends_on加上condition: service_healthy是两个关键点。MySQL容器首次初始化需要建库建用户可能要几十秒如果应用容器不等它健康就直接启动连接必然失败而且Spring Boot连接失败会快速退出restart策略又把它拉起来形成反复重启。healthcheck用mysqladmin ping判断数据库真的就绪了应用容器才会被拉起。allowPublicKeyRetrievaltrue和useSSLfalse是MySQL 8默认认证插件下客户端能正常连库的常见组合少了任何一项都可能连不上。./init:/docker-entrypoint-initdb.d是把建表脚本挂进容器的初始化目录如果你拿到的版本是启动时自动同步表结构这个目录可以留空。启动命令只有一行docker compose up -d docker compose logs -f app第一条命令后台启动整套容器第二条跟踪应用日志。看到Started Application in xxx seconds这样的日志说明应用起来了。登录页一般在http://服务器IP:8080/如果访问不到先检查云安全组或防火墙是否放行了8080端口再进容器看日志这一步排掉了八成的部署失败。3.3 源码打包方式改代码后手动部署的完整链路如果要在Foxnic-EAM上做二次开发比如改资产卡片字段、加自定义报表需要走源码打包方式。流程是先拉取源码再用Maven打包后端然后单独构建前端资源并合并到后端静态目录最后用java -jar启动。# 1. 拉取源码仓库地址以发布包说明为准 git clone foxnic-eam源码地址 foxnic-eam cd foxnic-eam # 2. 编译后端跳过测试加快构建 mvn clean package -DskipTests # 3. 查看后端产物 ls target/*.jar-DskipTests是编译打包时跳过单元测试避免测试用例跑半小时如果依赖下载慢给Maven配一个国内镜像源。产物是一个可执行jar包Spring Boot会把内嵌Tomcat一起打进去所以服务器上只要有JDK就能跑。生产环境的数据库连接一般写在application-prod.yml里启动时通过--spring.profiles.activeprod切换。一个典型配置如下spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://127.0.0.1:3306/foxnic_eam?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/ShanghaiuseSSLfalseallowPublicKeyRetrievaltrue username: eam password: Eam_123456 server: port: 8080characterEncodingutf8和serverTimezoneAsia/Shanghai这两个参数不要删。前者保证中文不乱码后者避免MySQL时区导致的日期差8小时。启动命令nohup java -jar target/foxnic-eam-xxx.jar --spring.profiles.activeprod app.log 21 nohup和是为了让进程在SSH断开后继续跑 app.log 21把标准输出和错误日志都写到文件里排查问题全靠它。如果前端是独立部署常见做法是Nginx做反向代理后端API和静态页面都走80端口server { listen 80; server_name eam.example.com; location / { 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; } }这段配置把所有请求转发给8080端口的jar进程。注意proxy_set_header三行不要省否则后端拿不到真实客户端IPFoxnic-EAM的系统日志和登录审计会全部显示为127.0.0.1。3.4 部署后的验证端口、日志、页面三连查部署动作做完先别急着往系统里导数据按下面三步验证一遍每一步都有明确结论这样后面配置排错时心里有底。# 1. 确认端口监听 ss -lntp | grep 8080 # 2. 确认应用日志无异常 docker compose logs -f app --tail200 # 3. 请求登录页HTTP状态 curl -I http://127.0.0.1:8080/第一步端口没监听说明启动失败或者启动中回去看日志第二步日志里如果出现APPLICATION FAILED TO START把下面堆栈里的Caused by贴出来八成是数据库账号密码或连接串参数问题第三步返回HTTP/1.1 200说明登录页能访问了再用浏览器打开看验证码和登录按钮。三步都过了部署环节才算真正收工。4. 从空系统到能上线编码规则、资产分类与审批流配置4.1 上线配置的正确顺序先分类后资产别急着导Excel刚部署完最容易犯的错是直接点资产导入把Excel一下子灌进去。结果分类树还是空的编码规则还是默认流水号导入进来的资产要么编号乱成一团要么没法按部门筛选。我踩过这个坑之后总结了一套固定顺序先建部门组织、再建人员账号、然后建资产分类树、建存放地点、定义编码规则、最后才导入或录入资产走通第一单领用申请后再逐步放开权限。顺序反了后面返工成本极高因为资产一旦有了变动记录改分类和编码规则就会牵连历史数据。4.2 资产分类树与存放地点数据规范决定盘点是否好做资产分类树是后续所有报表的统计维度建议两级或三级就够。比如办公设备下面分计算机、显示器、打印机计算机再分台式机和笔记本。每一级分类对应一个分类编码编码用大写字母加数字比如办公设备是BG计算机是BG-DN。分类层级太深会导致录入时每次都要选半天太浅则会让找到一台具体设备变得困难两级到三级是大多数公司的舒适区。存放地点同样要规范。Foxnic-EAM的存放地点通常是一棵树楼层、房间、工位或者库房、库位。不要让用户手工输入三楼靠窗座位这种自由文本否则盘点时根本不知道去哪找。我一般会建到楼栋-楼层-房间三级工位级的设备用责任人来定位而不是把工位都建进系统不然架构膨胀得离谱。4.3 资产编码规则流水号、类别码与年份段怎么组合资产编码是设备唯一的身份标识现场盘点全靠扫它。系统默认的编码规则往往只给一个流水号从0001递增到9999设备一多就分不清谁是谁。我建议用系统标识类别码年份流水号四段式规则片段含义示例EAM系统固定前缀标识业务系统EAMBG-DN资产分类树末级编码BG-DN2025入账年份20250001当年自动递增的4位流水号0001组合结果是EAM-BG-DN-2025-0001。这种结构扫码拿到的编号光看中间两段就知道是哪个部门哪类设备盘点的时候对不上账也能快速定位到范围。编码规则里要注意两个参数一是流水号是否每年重置推荐重置不然跨五年编号会又长又难读二是删除设备后流水号是否复用建议不复用资产系统要留审计痕迹编号重用会让历史单据指向另一台设备这是典型翻车点。如果系统支持自动生成和手工录入并存导入Excel时把资产编号列留空交给系统生成。4.4 审批流与数据权限让领用归还从口头变成系统记录部署完不配审批流系统就只是个电子台账和Excel没本质区别。Foxnic-EAM的流程引擎支持按单类型配置审批节点最常见的领用单流程是申请人提交→部门负责人审批→资产管理员确认发放。节点少但每一步都有操作时间记录。配置时先配流程再配角色权限最后给具体用户绑定角色顺序反了会导致用户登录后看不到发起申请按钮。数据权限是另一个常被忽略的点。Foxnic-EAM的权限模型里角色除了控制菜单能看哪些还控制数据可见范围全部数据、本部门数据、仅本人数据。一个普通员工如果配了全部数据登录后能看到全公司所有设备的购置金额这是信息安全事故如果资产管理员只配了仅本人那他盘点时看不到别的部门设备功能直接瘫痪。我给资产管理员配全部数据给部门负责人配本部门数据给普通员工配仅本人相关这样既够用又不越权。5. Foxnic-EAM部署与使用中的5个高频坑现象、原因、处置这套系统的坑不少下面五条是我反复见到、也自己踩过的按现象、原因、解决的格式写清楚照做能省下大半天排查时间。5.1 容器部署反复重启MySQL慢启动导致应用连连失败现象docker compose up -d后过两分钟再看app容器一直显示Restarting日志里刷Communications link failure或者Access denied for user eam。原因两个。一是MySQL容器首次初始化需要建库建用户、导入初始化脚本耗时超过Spring Boot的连接超时应用容器抢先启动后连不上库直接退出二是密码不一致compose文件里MYSQL_USER和MYSQL_PASSWORD定义了业务账号但application里写的不是同一个连库时权限被拒。解决第一类问题用healthcheck加depends_on.condition: service_healthy解决让MySQL健康后再启动app第二类问题统一三个地方的账号密码MySQL环境变量、数据库连接串、Foxnic-EAM配置文件一个字母都不要差。还要注意mysqladmin ping在MySQL 8里如果密码带特殊字符命令行里也要正确转义否则健康检查永远通过不了app会一直等着。5.2 新用户登录后菜单残缺、资产空白权限三元组没配齐现象用admin创建完新用户登录进去发现左侧菜单只有个人中心几个入口资产台账列表也提示无数据权限。开发者第一反应是用户没启用反复检查账号状态仍然无效。原因Foxnic-EAM的用户、角色、数据权限是三元组绑定关系。只建了用户账号没绑定角色菜单权限为空绑定了角色但角色没勾选数据权限资产列表依然查不到数据。有些版本对菜单权限做了缓存改了角色不刷新用户终端也不会立刻生效。解决进入角色管理确认角色已勾选菜单树比如资产管理→资产台账→查询再把角色的数据权限设为全部数据或本部门数据最后把用户加入该角色。如果界面配置都正确还是不生效检查系统缓存刷新或让用户重新登录。不要直接改数据库的user_role表框架有缓存改了反而可能被覆盖。5.3 Excel导入资产报重复、乱码模板列类型与编码规则冲突现象下载系统提供的导入模板填完几十行后点导入提示资产编号重复或导入失败请检查第N行打开看一眼日期列还变成了科学计数法。原因Foxnic-EAM的编码规则自动生成导入模板里的资产编号列如果被填了值系统会按新增校验重复如果留空自动走规则生成但模板里日期列被Excel转成了文本或科学计数法OLE字段类型不匹配导致导入中断。解决导入前把模板里的资产编号列全部清空日期列手动设为文本格式再填数量列保持数值格式。导入方式选仅新增不要选更新已有避免历史数据被误覆盖。如果系统支持先下载当前台账再修改那就在导出模板上改别从网上下载古董Excel当模板用列头对不上最容易导入失败。5.4 Docker里验证码图片裂开容器缺字体库现象Docker部署完成后登录页能打开但验证码区域显示红叉或空白F12看验证码接口返回500日志里有java.awt.FontConfiguration相关异常。原因验证码图片是Java在内存里画出来的画图要加载系统的字体文件。基础镜像如openjdk:8-jre里没有装任何中文字体字体配置加载失败图形验证码组件直接抛异常。这不是代码问题是容器镜像缺依赖。解决在Dockerfile里补装字体包最常见的是fontconfig和fonts-dejavu-core两个包。修改后重建镜像再启动验证码接口就正常了。如果你是手动部署在CentOS上基本不会遇到这个坑因为系统自带字体但用精简镜像部署时务必把这段写进Dockerfile省得复盘时查半小时。FROM openjdk:8-jre WORKDIR /opt/app COPY foxnic-eam.jar app.jar RUN apt-get update apt-get install -y fontconfig fonts-dejavu-core rm -rf /var/lib/apt/lists/* EXPOSE 8080 ENTRYPOINT [java, -jar, app.jar, --spring.profiles.activeprod]5.5 Nginx反代后刷新页面404Vue路由模式与try_files不匹配现象用Nginx把80端口代理到8080后从首页点菜单能正常跳转但直接在浏览器地址栏敲http://服务器IP/asset/list按回车Nginx返回404。原因Foxnic-EAM前端是Vue应用用了history模式路由。点击跳转时路由由前端JS处理不发起真实请求但手动刷新或直达URL会以路径形式请求NginxNginx默认按文件路径找找不到就404而后端真实的API路径在另一个前缀下。解决在Nginx的location /里加一行try_files $uri $uri/ /index.html;让所有前端路径兜底到首页由Vue自己路由。同时保证后端API前缀不被该规则拦截避免把API请求也打到index.html。改完执行nginx -s reload刷新问题就没了。6. 进阶验证用盘点闭环检验Foxnic-EAM是否真正落地6.1 二维码标签与现场盘点让台账不再是纸上数字资产系统上线后最怕台账漂亮现场找不到设备。我的建议是拿盘点模块当验收标准而不是拿录入完成率当指标。先把每个资产编号生成二维码打印成标签贴到设备显著位置。二维码内容只放资产编号不要放系统内部的资产ID因为盘点时要用编号和人沟通ID没有业务含义。如果版本没有内置打印模板可以把资产编号导出后用第三方标签工具批量生成尺寸用40mm×30mm的哑银标签贴在笔记本电脑底壳或机柜正面耐磨。6.2 月度盘点与差异处理我把它当成系统上线验收标准Foxnic-EAM的盘点模块一般支持按部门或存放地点生成盘点单。我习惯配置每月一号由资产管理员发起全量盘点盘点单生成后责任人扫码逐台核对状态正常的直接确认找不到的在盘点单里标记盘亏现场发现台账没有的设备登记盘盈。盘点结束后系统生成差异明细逐条处理盘亏的确认丢失原因并提交处置流程盘盈的补建卡片补充来源信息处理完再回写台账状态。以前我部署完一个系统就宣布上线结果半年后月度盘点还是靠Excel对账因为扫码盘点和差异回写链路没走通。后来我把生成盘点单→扫码盘点→差异处理→台账变更整个闭环跑通才敢说系统真正落地了。跑通之后你就知道Foxnic-EAM真正值钱的地方不在录入界面而在于它能把一次几百台设备的盘点压缩到半天并让每一条差异都有责任人。这套方法对你们同样适用希望帮到你。本文还有配套的精品资源点击获取
返回列表