【原创唯一】基于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

相关新闻

Day2 数据结构(2)

Day2 数据结构(2)

今天学习了数据结构中的链表中的单向链表,在学习中主要有以下几点困难地方1.对于指针来操作一些结构体还是不太熟练,比如在练习单向链表中的对数据进行倒序的时候,指针指向结构体不太清楚,还有访问结构体里面的指针的时候指向节点…

2026/10/9 0:45:44 阅读更多 →
TKMyBatis实战指南:告别重复CRUD,提升MyBatis开发效率

TKMyBatis实战指南:告别重复CRUD,提升MyBatis开发效率

1. 项目概述:为什么我们需要TKMyBatis? 如果你用MyBatis做过几个项目,尤其是那种表结构复杂、实体类众多的后台管理系统,你大概率会和我有一样的感受:写SQL是爽,但写那些重复的增删改查(CRUD&am…

2026/10/12 19:18:20 阅读更多 →
告别LaTeX表格手工编码:超强工具实现图形化设计与代码自动生成

告别LaTeX表格手工编码:超强工具实现图形化设计与代码自动生成

1. 项目概述:告别LaTeX表格的“手工活” 如果你用过LaTeX排版,尤其是写过论文、技术报告或者书籍,那你一定对制作表格这件事又爱又恨。爱的是它最终呈现出的那份严谨、精致和专业感,恨的是在代码编辑器里手动调整 \hline 、 \m…

2026/10/7 7:07:26 阅读更多 →

最新新闻

Navicat 15安装配置与使用指南:从连接到高效管理

Navicat 15安装配置与使用指南:从连接到高效管理

很多人拿到Navicat 15,第一反应是去搜各种激活工具、注册码,但这条路既容易踩到恶意软件的坑,也会给自己留下不必要的隐患。我见过不少开发者因为图省事,最后数据库连接工具里被塞了一堆不明插件,轻则弹窗广告&#xf…

2026/10/13 11:16:31 阅读更多 →
Linux/macOS中用TIME_STYLE统一ls时间格式

Linux/macOS中用TIME_STYLE统一ls时间格式

1. 项目概述:为什么改 ls 的时间格式不是“炫技”,而是日常效率刚需 在终端里敲 ls -l 看文件列表,你是不是也经常盯着那一串时间发愣?比如看到 Oct 12 2022 或 Apr 5 14:32 ,第一反应是——这到底是去年还是前年…

2026/10/13 11:16:31 阅读更多 →
WSL2下STM32烧录实战:USB透传与OpenOCD完整方案

WSL2下STM32烧录实战:USB透传与OpenOCD完整方案

开篇先讲个真实场景。我用WSL2做STM32的C开发,平时编译、链接、看反汇编全在Linux侧完成,顺手得很。直到有一天,我写好一段新的串口驱动,准备把它烧进板子验证,插上ST-Link和开发板,Windows那边弹出"设…

2026/10/13 11:16:31 阅读更多 →
2FSK调制解调MATLAB仿真:相干与非相干误码率对比

2FSK调制解调MATLAB仿真:相干与非相干误码率对比

2FSK 是数字通信入门阶段绕不开的一个调制方式,正好也是 MATLAB 仿真里非常适合用来练手的项目。最近我刚把一套完整的 2FSK 仿真流程重新整理了一遍,从码元生成、载波调制、加噪到三种不同解调方式的对比全都跑通了,这里把完整思路和代码细节…

2026/10/13 11:16:31 阅读更多 →
PHP反序列化漏洞原理与POP链实战解析

PHP反序列化漏洞原理与POP链实战解析

1. 项目概述:这不是“玩具靶场”,而是PHP反序列化漏洞的实战沙盒你搜到“PiKachu靶场之PHP反序列化漏洞”这个标题,大概率正卡在两个状态之间:要么刚学完serialize()和unserialize()函数,对着文档里那句“可能引发远程…

2026/10/13 11:16:31 阅读更多 →
能生成背景音乐的AI音乐APP怎么选

能生成背景音乐的AI音乐APP怎么选

在短视频剪辑、Vlog 创作、影视解说、商业广告、游戏场景、直播氛围搭建等内容生产场景中,原创背景音乐是提升作品质感的关键要素。传统配乐方式普遍存在两类核心痛点:一是商用素材库内容同质化严重,大量创作者使用同款 BGM,作品辨…

2026/10/13 11:15:30 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →