简介:这份资源是一套基于Java的固定资产管理系统完整源码,采用若依(RuoYi)框架搭配layui前端构建,面向需要学习企业级后台开发或二次开发资产管理系统的Java开发者与计算机专业学生。系统覆盖资产登记、领用借用归还、维修调拨转移、报废处理、统计分析等业务闭环,并内置组织结构管理与角色权限分配,可帮助读者理解权限控制、审批流转与资产全生命周期管理的实现思路。压缩包共1883个文件,约8.88MB,以317个java源文件、180个html页面、90个js脚本、40个css样式及38个xml配置为主,另有sql建表脚本、yml配置与图片字体等静态资源,目录结构完整,便于按模块定位后端服务、前端页面与数据库设计。目前已有563人学习下载,适合作为若依框架实战参考与固定资产管理类项目的开发底稿。
1. 固定资产管理源码:一套 Java 若依框架的资产全生命周期落地包
上个月帮一家做仓储物流的客户梳理资产台账,财务那边还在用 Excel 手工登记,一台叉车从采购到报废要跨三个部门、改四张表,盘点时对不上账是常态。这类需求其实非常典型:资产入库、领用、调拨、维修、折旧、报废,每个环节都要留痕,还要能按部门、按类别、按时间维度出报表。我翻了不少开源方案,最后落到一套基于 Java 若依框架的固定资产管理源码上——它把资产全生命周期的主干流程都铺好了,权限、菜单、字典、代码生成这些若依自带的能力直接复用,省掉大量脚手架工作。这套东西适合谁?中小团队的后端开发、需要快速交付资产管理模块的从业者,以及想拿一套完整业务系统练手若依二次开发的人。下面我按「它是什么、怎么跑起来、坑在哪」的顺序拆给你看。
2. 若依底座与资产模块的耦合关系:先搞清哪些是框架给的、哪些是业务写的
拿到一套若依系源码,第一件事不是急着mvn编译,而是分清层次。若依框架本身提供了用户、角色、菜单、部门、字典、日志、代码生成这一整套后台基建,固定资产管理模块是在这个底座上长出来的业务层。搞不清这条边界,后面改需求时你会把框架代码和业务代码搅在一起,升级或排错都难受。
2.1 目录结构与模块职责划分
典型的若依多模块工程长这样,资产相关代码集中在业务模块里:
ruoyi-admin # 启动模块,含 application.yml 与主类 ruoyi-framework # 框架核心:安全、拦截器、数据权限 ruoyi-system # 系统管理:用户/角色/菜单/部门/字典 ruoyi-common # 工具类、常量、注解、基类 ruoyi-assets # 固定资产业务模块(不同包名可能不同) ruoyi-generator # 代码生成器资产模块内部一般再按controller / service / mapper / domain四层切分,domain下是实体类,mapper下是 MyBatis 的 XML 与接口,service写业务规则,controller暴露 REST 接口给前端。判断一个类该放哪,看它依赖谁:只依赖ruoyi-common的工具类放 common,涉及资产表结构的放 assets,别往 system 里塞业务表,否则后面做数据权限隔离时会很别扭。
2.2 资产主表与关联表的设计逻辑
固定资产的核心表通常围绕「一物一码」展开,主表存资产身份信息,从表存流转记录。常见结构如下:
| 表名 | 作用 | 关键字段 |
|---|---|---|
asset_info | 资产主档 | 资产编码、名称、分类、购置日期、原值、状态、使用部门、使用人 |
asset_category | 资产分类 | 分类编码、名称、折旧年限、残值率 |
asset_use_record | 领用/归还记录 | 资产ID、领用人、领用时间、归还时间 |
asset_transfer | 调拨记录 | 资产ID、调出部门、调入部门、调拨时间 |
asset_repair | 维修记录 | 资产ID、维修日期、费用、维修方 |
asset_scrap | 报废记录 | 资产ID、报废原因、审批状态、报废日期 |
设计上有个关键取舍:资产「当前状态」是冗余存在主表里,还是每次从流转记录实时算?我一般倾向主表冗余一个status字段,流转时同步更新,因为列表页和盘点页要频繁按状态过滤,实时 join 多张记录表在数据量大时会拖慢查询。代价是要保证状态变更和记录写入在同一个事务里,这点后面避坑章节会专门说。
2.3 权限与数据权限的挂载点
若依的数据权限是通过@DataScope注解加 SQL 拼接实现的,资产模块要复用这套机制,得在 mapper 的查询语句里预留部门过滤的占位。典型写法是在 service 层给查询参数设置params.dataScope,XML 里用${params.dataScope}拼进去。资产场景下通常按「使用部门」做数据隔离——部门管理员只能看本部门资产,财务和资产管理员看全量。这个挂载点如果一开始没设计好,后期补数据权限要改一堆 SQL,血泪经验是:建表时就把dept_id带上,别等到上线才想起来。
3. 从零跑通资产模块:环境、建表、启动与接口验证
这一章是能直接抄作业的部分。假设你拿到的是标准若依前后端分离版加资产业务模块,按下面顺序走,基本能在一两个小时内看到登录页和资产列表。
3.1 环境准备与依赖版本对齐
若依对版本比较敏感,JDK、Maven、MySQL、Redis 四样对齐了再动手:
# 检查基础环境,版本不对后面编译报错很难定位 java -version # 建议 JDK 8 或 JDK 17,看源码 pom 里定的 mvn -v # Maven 3.6+ mysql --version # MySQL 5.7 / 8.0 redis-cli --version # Redis 5+JDK 版本以pom.xml里<java.version>为准,别自作主张升到 21,若依部分版本用的反射和字节码库对新 JDK 兼容性一般。Redis 是若依存 token 和缓存的必需项,本地没起 Redis 直接启动会卡在连接超时,报错信息还不一定指向 Redis,这是新手最容易翻车的第一站。
3.2 数据库初始化与配置修改
建库、导 SQL、改连接配置,三步走:
-- 建库,字符集用 utf8mb4,资产名称里常有特殊符号 CREATE DATABASE ry_assets DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;# 导入若依基础表 + 资产业务表,注意顺序:先基础后业务 mysql -uroot -p ry_assets < sql/ry_2023xxxx.sql mysql -uroot -p ry_assets < sql/asset_business.sql然后改ruoyi-admin/src/main/resources/application-druid.yml里的数据源,以及application.yml里的 Redis 地址和端口。资产模块如果用了文件上传(比如资产照片、发票扫描件),还要确认profile上传路径存在且可写,路径配错的表现是上传接口返回成功但文件找不到,排查起来很费时间。
3.3 启动与资产接口冒烟验证
# 编译并启动,跳过测试加快首次启动 mvn clean package -DskipTests java -jar ruoyi-admin/target/ruoyi-admin.jar启动成功后默认端口 8080,先用系统账号登录拿 token,再调资产列表接口验证业务链路是否通:
# 登录获取 token,验证码开关在 application.yml 的 captchaEnabled curl -X POST http://localhost:8080/login \ -H "Content-Type: application/json" \ -d '{"username":"admin","password":"admin123"}' # 带 token 查资产分页列表,确认业务表和权限都生效 curl http://localhost:8080/assets/info/list?pageNum=1&pageSize=10 \ -H "Authorization: Bearer <上一步返回的token>"接口能返回{"total":0,"rows":[]}说明表结构、mapper、权限链路都通了,接下来往asset_info插几条测试数据,再验证领用、调拨接口。这里有个参数细节:若依分页参数固定是pageNum和pageSize,别写成page和limit,前端表格组件默认就按这套传,改了对不上。
3.4 资产状态流转的实现要点
资产从「在库」到「领用」再到「报废」,状态机要收敛在 service 层,别让 controller 直接改状态字段:
// 领用资产:校验状态 + 更新主表 + 写流转记录,三件事一个事务 @Transactional(rollbackFor = Exception.class) public int useAsset(Long assetId, Long userId, String remark) { AssetInfo asset = assetInfoMapper.selectById(assetId); // 只有「在库」状态才能领用,防止重复领用 if (!"0".equals(asset.getStatus())) { throw new ServiceException("当前资产状态不允许领用"); } asset.setStatus("1"); // 1=使用中 asset.setUserId(userId); assetInfoMapper.updateById(asset); AssetUseRecord record = new AssetUseRecord(); record.setAssetId(assetId); record.setUserId(userId); record.setUseTime(new Date()); record.setRemark(remark); return assetUseRecordMapper.insert(record); }@Transactional的rollbackFor一定要写Exception.class,否则受检异常不回滚,主表状态改了但记录没写进去,账就对不上。状态码建议用字典表管理(若依自带sys_dict_data),别在代码里散落魔法字符串,后期加「维修中」「待报废」状态时改一处就够。
4. 折旧计算与盘点对账:业务规则最容易出错的两块
资产系统真正难的不是增删改查,是折旧和盘点。这两块规则性强、容错低,算错一分钱财务都要找你。
4.1 折旧算法的选型与实现
常见折旧方法有年限平均法、工作量法、双倍余额递减法。中小企业资产系统九成用年限平均法,公式是「月折旧额 =(原值 − 残值)÷(折旧年限 × 12)」。实现时注意三点:残值率从分类表取,不要写死;折旧起始月按会计准则通常是「当月增加次月计提」;已提足折旧的资产不再计提。
// 年限平均法计算某资产当月折旧额 public BigDecimal calcMonthlyDepreciation(AssetInfo asset, AssetCategory category) { BigDecimal original = asset.getOriginalValue(); // 原值 BigDecimal residualRate = category.getResidualRate(); // 残值率,如 0.05 int years = category.getDepreciationYears(); // 折旧年限 BigDecimal residual = original.multiply(residualRate); // 残值 // 保留两位小数,四舍五入,避免浮点误差累积 return original.subtract(residual) .divide(BigDecimal.valueOf(years * 12L), 2, RoundingMode.HALF_UP); }金额一律用BigDecimal,别用double,浮点误差在月度累加后会放大成对不上的账。折旧任务一般做成定时任务,若依自带 Quartz 集成,配一个每月 1 号凌晨跑的 job 即可,执行前先判断该月是否已计提,防止重复跑导致多提折旧。
4.2 盘点单与账实核对
盘点本质是「账面数据 vs 实盘数据」的比对。设计上生成盘点单时快照一份账面资产清单,盘点人逐条填实盘结果,最后出差异表。关键点是快照——不能盘点过程中资产被调拨了,盘点单里的账面数跟着变,那差异就没意义了。差异处理一般分「盘盈」「盘亏」「信息不符」三类,盘亏要走报废或责任认定流程,别直接在盘点单里改主表状态,留痕比省事重要。
4.3 报表导出的性能处理
资产台账导出动辄几千上万行,若依默认用 EasyExcel 或 POI,直接一次性查全量再写会 OOM。常见做法是分页查询、分批写入,或者用 EasyExcel 的SXSSFWorkbook模式控制内存占用。导出字段多时给个字段选择,别一股脑全导,财务真正要的往往就那十几列。
5. 避坑与排查:这套源码落地时最容易翻车的五个点
5.1 启动报 Redis 连接失败但错误栈指向别处
现象:启动日志报Unable to connect to Redis,但往上翻还有一堆 bean 初始化异常,看着像 Spring 配置问题。原因:若依的 token 存储强依赖 Redis,Redis 没起或密码不对时,异常在容器初始化阶段被包装了。解决:先单独redis-cli ping确认 Redis 活着,再核对application.yml里spring.redis的 host、port、password、database 四项,密码为空时别留空字符串,直接删掉该配置项。
5.2 资产状态改了但流转记录没写进去
现象:领用操作后主表状态变成「使用中」,但领用记录表查不到数据。原因:service 方法没加事务,或者加了但异常被 catch 吞掉没抛出。解决:确认方法上有@Transactional(rollbackFor = Exception.class),且内部没有try-catch把异常吃掉;若依的ServiceException会被全局异常处理器接住,放心抛。
5.3 数据权限不生效,部门管理员看到全部资产
现象:给部门管理员配了角色,登录后资产列表还是全量。原因:mapper XML 里没拼${params.dataScope},或者 service 层没调dataScopeFilter。解决:对照若依自带的用户查询写法,在 service 查询前设置数据权限参数,XML 的 where 条件里预留占位;注意@DataScope注解的deptAlias要和 SQL 里的表别名一致,别名写错等于没加。
5.4 资产编码重复或并发领用同一资产
现象:两个人同时点领用,同一台资产出现两条领用记录。原因:先查状态再更新,中间没有锁,并发下都读到「在库」。解决:更新时带上状态条件做乐观锁,update asset_info set status='1' where id=? and status='0',根据影响行数判断是否抢到;影响行数为 0 就提示「资产已被占用」。
5.5 导出大台账时服务内存飙升
现象:导出上万行资产后服务变慢甚至 OOM。原因:一次性selectList全量加载再 POI 写。解决:改分批查询,每批 500 到 1000 条写入 Excel;或换 EasyExcel 流式写。导出接口也建议加个行数上限提示,超限引导用户加筛选条件。
6. 二次开发进阶:把资产模块改成贴合自己业务的形态
源码能跑通只是起点,真正交付时几乎都要改。我的习惯是先做「字段扩展」再做「流程扩展」。字段扩展走若依代码生成器最省事:在数据库给asset_info加字段,用 generator 重新生成 domain、mapper、service、controller 和前端表单,注意生成时选「覆盖」还是「新增」要看清,覆盖会冲掉你手改过的业务逻辑,后悔药可没有。流程扩展比如加「资产借用审批」,可以复用若依的工作流集成或自己写状态机,但审批节点别硬编码在 controller 里,抽成配置表,后面加节点不用改代码。
验证改造是否成功,我一般跑三条线:一是单条资产走完「入库→领用→调拨→维修→报废」全流程,看每步记录和状态是否一致;二是并发领用同一资产,确认乐观锁生效;三是按部门账号登录,确认数据权限隔离正确。这三条过了,基本能交付。
有个习惯我保持了几年:每次改完资产状态相关的代码,都强制走一遍「造一条测试资产、跑完整流转、核对主表和记录表」的回归,哪怕只改了一行。资产系统的账一旦错,追溯成本远高于多跑一遍测试。希望这套拆解帮到你,拿到源码后先按第 3 章跑通,再动业务代码,顺序别反。
本文还有配套的精品资源,点击获取