尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

【原创唯一】基于SpringBoot+Vue的固定资产管理系统 课程设计/大作业/期末作业(源码+MySQL数据库+实验报告+PPT+远程部署)

【原创唯一】基于SpringBoot+Vue的固定资产管理系统 课程设计/大作业/期末作业(源码+MySQL数据库+实验报告+PPT+远程部署) 摘要企事业单位办公设备、家具等固定资产数量庞大传统依赖 Excel 或纸质台账的管理方式存在信息分散、领用流程不规范、库存账实不符等问题。本文设计并实现了一套基于 B/S 架构的固定资产管理系统采用前后端分离模式面向管理员与员工两类角色覆盖办公设备采购入库、领用登记、归还与报废审批、库存盘点及资产分类统计等核心业务。系统后端基于 Spring Boot 构建 RESTful 服务持久层采用 MyBatis-Plus 访问 MySQL 数据库通过 JWT 实现无状态身份认证与基于角色的访问控制前端采用 Vue 3 单页应用配合 Element Plus 与 ECharts 实现统一后台界面与数据可视化。数据库设计包含管理员、员工、资产分类、固定资产、领用记录、库存盘点及盘点明细共七张业务表领用状态采用「待审批→借用中→已归还/已报废」的完整流转模型并与库存数量联动。经功能测试系统各模块运行稳定满足办公资产从采购入库、员工申领、管理员审批到归还报废及盘点的业务闭环需求对同类 Web 管理系统的开发具有一定的参考价值。技术栈 Spring Boot 3 MyBatis-Plus MySQL Vue 3 Element Plus EChartsSpring Boot3uni-appVue3uViewPlusViteMybatsiPlusEcharts微信小程序数据库表5张文末获取联系文末获取联系作者介绍专注计算机课设、毕设辅导个人开发坚持原创非工作室源码全网唯一。✅技术主流SpringBoot Vue 前后端分离MySQLEcharts数据统计可本地运行✅配套资料源码 数据库 实验报告/论文 答辩 PPT部署演示远程调试问题解答技术范围SpringBoot、Vue、数据可视化、小程序、HLMT、Nodejs、uni-app、MySQL数据库、ElementUi等设计与开发。适用范围软件工程、软件技术、数据库课程设计、计算机科学与技术、数据库系统原理、JavaWeb开发、JavaEE、Java、Web应用开发、动态网页设计的课程设计、课设、大作业、课程实验、期末作业实验报告参考内容实验报告可供大家参考使用功能展示角色功能模块说明管理员采购入库登记新资产或补货入库增加库存总量与可领数量管理员资产分类维护计算机设备、办公桌椅等分类管理员领用登记直接为员工登记领用状态为借用中管理员申领审批审批员工在线申领批准或驳回管理员归还/报废审批确认员工归还或报废申请管理员库存盘点创建盘点单、录入实盘、完成盘点并调整库存管理员分类统计KPI 与 ECharts 图表展示管理员员工管理员工账号增删改查、启用停用员工申领资产选择可领用资产提交申请员工我的领用查看本人领用记录申请归还或报废员工管理员数据库及架构系统数据库设计为Controller及Service层核心代码写法package com.springboot.controller; import com.springboot.auth.RequireRole; import com.springboot.dto.*; import com.springboot.entity.BorrowRecord; import com.springboot.entity.UserRole; import com.springboot.service.BorrowRecordService; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; RestController RequestMapping(/api/borrows) RequiredArgsConstructor public class BorrowController { private final BorrowRecordService borrowService; GetMapping(/page) RequireRole({UserRole.ADMIN, UserRole.USER}) public ApiResponsePageResultBorrowRecord page( RequestParam(required false) String keyword, RequestParam(required false) String status, RequestParam(defaultValue 1) int page, RequestParam(defaultValue 10) int size) { return ApiResponse.ok(borrowService.page(keyword, status, page, size)); } GetMapping(/pending-approval) RequireRole({UserRole.ADMIN}) public ApiResponsePageResultBorrowRecord pendingApproval( RequestParam(defaultValue 1) int page, RequestParam(defaultValue 10) int size) { return ApiResponse.ok(borrowService.pagePendingApproval(page, size)); } GetMapping(/{id}) RequireRole({UserRole.ADMIN, UserRole.USER}) public ApiResponseBorrowRecord detail(PathVariable Long id) { return ApiResponse.ok(borrowService.getById(id)); } PostMapping(/apply) RequireRole({UserRole.USER}) public ApiResponseBorrowRecord apply(RequestBody BorrowApplyDTO dto) { return ApiResponse.ok(申领已提交, borrowService.apply(dto)); } PostMapping(/register) RequireRole({UserRole.ADMIN}) public ApiResponseBorrowRecord register(RequestBody BorrowRegisterDTO dto) { return ApiResponse.ok(领用登记成功, borrowService.register(dto)); } PutMapping(/{id}/approve) RequireRole({UserRole.ADMIN}) public ApiResponseBorrowRecord approve(PathVariable Long id, RequestBody(required false) BorrowRemarkDTO dto) { return ApiResponse.ok(审批通过, borrowService.approve(id, dto)); } PutMapping(/{id}/reject) RequireRole({UserRole.ADMIN}) public ApiResponseBorrowRecord reject(PathVariable Long id, RequestBody(required false) BorrowRemarkDTO dto) { return ApiResponse.ok(已驳回, borrowService.reject(id, dto)); } PutMapping(/{id}/request-return) RequireRole({UserRole.ADMIN, UserRole.USER}) public ApiResponseBorrowRecord requestReturn(PathVariable Long id) { return ApiResponse.ok(归还申请已提交, borrowService.requestReturn(id)); } PutMapping(/{id}/request-scrap) RequireRole({UserRole.ADMIN, UserRole.USER}) public ApiResponseBorrowRecord requestScrap(PathVariable Long id) { return ApiResponse.ok(报废申请已提交, borrowService.requestScrap(id)); } PutMapping(/{id}/approve-return) RequireRole({UserRole.ADMIN}) public ApiResponseBorrowRecord approveReturn(PathVariable Long id, RequestBody(required false) BorrowRemarkDTO dto) { return ApiResponse.ok(归还已确认, borrowService.approveReturn(id, dto)); } PutMapping(/{id}/approve-scrap) RequireRole({UserRole.ADMIN}) public ApiResponseBorrowRecord approveScrap(PathVariable Long id, RequestBody(required false) BorrowRemarkDTO dto) { return ApiResponse.ok(报废已确认, borrowService.approveScrap(id, dto)); } DeleteMapping(/{id}) RequireRole({UserRole.ADMIN}) public ApiResponseVoid delete(PathVariable Long id) { borrowService.delete(id); return ApiResponse.ok(删除成功, null); } } package com.springboot.service; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.springboot.auth.AuthContext; import com.springboot.dto.BorrowApplyDTO; import com.springboot.dto.BorrowRegisterDTO; import com.springboot.dto.BorrowRemarkDTO; import com.springboot.dto.PageResult; import com.springboot.entity.*; import com.springboot.mapper.AssetCategoryMapper; import com.springboot.mapper.AssetMapper; import com.springboot.mapper.BorrowRecordMapper; import com.springboot.mapper.CustomerMapper; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.StringUtils; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.*; import java.util.stream.Collectors; Service RequiredArgsConstructor public class BorrowRecordService { private final BorrowRecordMapper borrowMapper; private final AssetMapper assetMapper; private final AssetService assetService; private final CustomerMapper customerMapper; private final AssetCategoryMapper categoryMapper; public PageResultBorrowRecord page(String keyword, String status, int page, int size) { var wrapper buildQuery(keyword, status); PageBorrowRecord result borrowMapper.selectPage(new Page(page, size), wrapper); enrich(result.getRecords()); return PageResult.of(result); } public PageResultBorrowRecord pagePendingApproval(int page, int size) { var wrapper Wrappers.BorrowRecordlambdaQuery() .in(BorrowRecord::getStatus, BorrowStatus.RETURN_PENDING, BorrowStatus.SCRAP_PENDING) .orderByDesc(BorrowRecord::getId); PageBorrowRecord result borrowMapper.selectPage(new Page(page, size), wrapper); enrich(result.getRecords()); return PageResult.of(result); } public BorrowRecord getById(Long id) { BorrowRecord r borrowMapper.selectById(id); if (r null) throw new RuntimeException(领用记录不存在); if (AuthContext.isUser() !Objects.equals(r.getUser_id(), AuthContext.getUserId())) { throw new RuntimeException(无权查看该记录); } enrich(List.of(r)); return r; } Transactional public BorrowRecord apply(BorrowApplyDTO dto) { validateApply(dto); Asset asset assetMapper.selectById(dto.getAsset_id()); if (asset null || asset.getEnabled() ! 1) throw new RuntimeException(资产不存在或已停用); if (asset.getQuantity_available() dto.getQuantity()) throw new RuntimeException(可领用库存不足); BorrowRecord r new BorrowRecord(); r.setRecord_no(generateRecordNo()); r.setUser_id(AuthContext.getUserId()); r.setAsset_id(dto.getAsset_id()); r.setQuantity(dto.getQuantity()); r.setPurpose(dto.getPurpose()); r.setRecord_type(申领); r.setStatus(BorrowStatus.PENDING); r.setApply_date(LocalDateTime.now()); r.setExpected_return_date(dto.getExpected_return_date()); r.setCreated_at(LocalDateTime.now()); r.setUpdated_at(LocalDateTime.now()); borrowMapper.insert(r); enrich(List.of(r)); return r; } Transactional public BorrowRecord register(BorrowRegisterDTO dto) { if (dto.getUser_id() null) throw new RuntimeException(请选择领用人); if (customerMapper.selectById(dto.getUser_id()) null) throw new RuntimeException(领用人不存在); validateQuantity(dto.getAsset_id(), dto.getQuantity()); BorrowRecord r new BorrowRecord(); r.setRecord_no(generateRecordNo()); r.setUser_id(dto.getUser_id()); r.setAsset_id(dto.getAsset_id()); r.setQuantity(dto.getQuantity()); r.setPurpose(dto.getPurpose()); r.setRecord_type(登记); r.setStatus(BorrowStatus.BORROWING); r.setApply_date(LocalDateTime.now()); r.setBorrow_date(LocalDateTime.now()); r.setExpected_return_date(dto.getExpected_return_date()); r.setCreated_at(LocalDateTime.now()); r.setUpdated_at(LocalDateTime.now()); borrowMapper.insert(r); assetService.deductStock(dto.getAsset_id(), dto.getQuantity()); enrich(List.of(r)); return r; } Transactional public BorrowRecord approve(Long id, BorrowRemarkDTO dto) { BorrowRecord r getForAdmin(id); if (!BorrowStatus.PENDING.equals(r.getStatus())) throw new RuntimeException(仅待审批记录可批准); assetService.deductStock(r.getAsset_id(), r.getQuantity()); r.setStatus(BorrowStatus.BORROWING); r.setBorrow_date(LocalDateTime.now()); r.setAdmin_remark(dto ! null ? dto.getAdmin_remark() : null); r.setUpdated_at(LocalDateTime.now()); borrowMapper.updateById(r); enrich(List.of(r)); return r; } Transactional public BorrowRecord reject(Long id, BorrowRemarkDTO dto) { BorrowRecord r getForAdmin(id); if (!BorrowStatus.PENDING.equals(r.getStatus())) throw new RuntimeException(仅待审批记录可驳回); r.setStatus(BorrowStatus.REJECTED); r.setAdmin_remark(dto ! null ? dto.getAdmin_remark() : null); r.setUpdated_at(LocalDateTime.now()); borrowMapper.updateById(r); enrich(List.of(r)); return r; } Transactional public BorrowRecord requestReturn(Long id) { BorrowRecord r getOwnedOrAdmin(id); if (!BorrowStatus.BORROWING.equals(r.getStatus())) throw new RuntimeException(仅借用中可申请归还); r.setStatus(BorrowStatus.RETURN_PENDING); r.setUpdated_at(LocalDateTime.now()); borrowMapper.updateById(r); enrich(List.of(r)); return r; } Transactional public BorrowRecord requestScrap(Long id) { BorrowRecord r getOwnedOrAdmin(id); if (!BorrowStatus.BORROWING.equals(r.getStatus())) throw new RuntimeException(仅借用中可申请报废); r.setStatus(BorrowStatus.SCRAP_PENDING); r.setUpdated_at(LocalDateTime.now()); borrowMapper.updateById(r); enrich(List.of(r)); return r; } Transactional public BorrowRecord approveReturn(Long id, BorrowRemarkDTO dto) { BorrowRecord r getForAdmin(id); if (!BorrowStatus.RETURN_PENDING.equals(r.getStatus())) throw new RuntimeException(仅待归还审批可确认); assetService.restoreStock(r.getAsset_id(), r.getQuantity()); r.setStatus(BorrowStatus.RETURNED); r.setReturn_date(LocalDateTime.now()); r.setAdmin_remark(dto ! null ? dto.getAdmin_remark() : null); r.setUpdated_at(LocalDateTime.now()); borrowMapper.updateById(r); enrich(List.of(r)); return r; } Transactional public BorrowRecord approveScrap(Long id, BorrowRemarkDTO dto) { BorrowRecord r getForAdmin(id); if (!BorrowStatus.SCRAP_PENDING.equals(r.getStatus())) throw new RuntimeException(仅待报废审批可确认); assetService.scrapStock(r.getAsset_id(), r.getQuantity()); r.setStatus(BorrowStatus.SCRAPED); r.setScrap_date(LocalDateTime.now()); r.setAdmin_remark(dto ! null ? dto.getAdmin_remark() : null); r.setUpdated_at(LocalDateTime.now()); borrowMapper.updateById(r); enrich(List.of(r)); return r; } Transactional public void delete(Long id) { BorrowRecord r getForAdmin(id); if (!BorrowStatus.PENDING.equals(r.getStatus()) !BorrowStatus.REJECTED.equals(r.getStatus())) { throw new RuntimeException(仅待审批或已驳回记录可删除); } borrowMapper.deleteById(id); } private BorrowRecord getForAdmin(Long id) { BorrowRecord r borrowMapper.selectById(id); if (r null) throw new RuntimeException(领用记录不存在); return r; } private BorrowRecord getOwnedOrAdmin(Long id) { BorrowRecord r borrowMapper.selectById(id); if (r null) throw new RuntimeException(领用记录不存在); if (AuthContext.isUser() !Objects.equals(r.getUser_id(), AuthContext.getUserId())) { throw new RuntimeException(无权操作该记录); } return r; } private void validateApply(BorrowApplyDTO dto) { if (dto.getAsset_id() null) throw new RuntimeException(请选择资产); validateQuantity(dto.getAsset_id(), dto.getQuantity()); if (!StringUtils.hasText(dto.getPurpose())) throw new RuntimeException(请填写用途说明); } private void validateQuantity(Long assetId, Integer quantity) { if (assetId null) throw new RuntimeException(请选择资产); int qty quantity ! null ? quantity : 0; if (qty 0) throw new RuntimeException(数量须大于0); Asset asset assetMapper.selectById(assetId); if (asset null || asset.getEnabled() ! 1) throw new RuntimeException(资产不存在或已停用); if (asset.getQuantity_available() qty) throw new RuntimeException(可领用库存不足); } private com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapperBorrowRecord buildQuery(String keyword, String status) { var wrapper Wrappers.BorrowRecordlambdaQuery() .eq(StringUtils.hasText(status), BorrowRecord::getStatus, status) .and(StringUtils.hasText(keyword), w - w .like(BorrowRecord::getRecord_no, keyword) .or().like(BorrowRecord::getPurpose, keyword)); if (AuthContext.isUser()) { wrapper.eq(BorrowRecord::getUser_id, AuthContext.getUserId()); } wrapper.orderByDesc(BorrowRecord::getId); return wrapper; } private String generateRecordNo() { return LY LocalDateTime.now().format(DateTimeFormatter.ofPattern(yyyyMMddHHmmss)) String.format(%04d, new Random().nextInt(10000)); } private void enrich(ListBorrowRecord list) { if (list null || list.isEmpty()) return; ListLong userIds list.stream().map(BorrowRecord::getUser_id).filter(Objects::nonNull).distinct().toList(); ListLong assetIds list.stream().map(BorrowRecord::getAsset_id).filter(Objects::nonNull).distinct().toList(); MapLong, Customer userMap userIds.isEmpty() ? Map.of() : customerMapper.selectBatchIds(userIds).stream().collect(Collectors.toMap(Customer::getId, c - c)); MapLong, Asset assetMap assetIds.isEmpty() ? Map.of() : assetMapper.selectBatchIds(assetIds).stream().collect(Collectors.toMap(Asset::getId, a - a)); ListLong catIds assetMap.values().stream().map(Asset::getCategory_id).filter(Objects::nonNull).distinct().toList(); MapLong, AssetCategory catMap catIds.isEmpty() ? Map.of() : categoryMapper.selectBatchIds(catIds).stream().collect(Collectors.toMap(AssetCategory::getId, c - c)); for (BorrowRecord r : list) { Customer u userMap.get(r.getUser_id()); if (u ! null) r.setUser_name(u.getReal_name() ! null ? u.getReal_name() : u.getUsername()); Asset a assetMap.get(r.getAsset_id()); if (a ! null) { r.setAsset_name(a.getName()); r.setAsset_code(a.getAsset_code()); AssetCategory c catMap.get(a.getCategory_id()); if (c ! null) r.setCategory_name(c.getName()); } } } }擅长功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文降重、长期答辩答疑辅导、腾讯会议一对一专业讲解辅导答辩、模拟答辩演练、和理解代码逻辑思路等。获取联系项目功能完整可在本地运行并可远程调试确保运行顺利获取联系方式课程设计获取https://blog.csdn.net/qq_59059632/article/details/163685632?spm1001.2014.3001.5501
返回列表