省钱兄 JAVA 无人共享无人借阅图书借阅系统源码 支持小程序+公众号+H5
✅ 支持 小程序 + 公众号 + H5 三端全覆盖
开发商:西安省钱兄网络科技有限公司
售价:¥8,889(套餐1)/ ¥10,889(套餐2含搭建+1年维护)
新更新:2026年5月13日(互站网在售)
系统整体架构
层级技术选型后端框架Spring Boot 2.7.x + MyBatis-Plus 3.5.0 + Spring Security(RBAC权限)数据库MySQL 8.0 + Redis 7.0(缓存/分布式锁/GEO)用户端UniApp 3.0(Vue3语法)→ 编译为 小程序 + 公众号 + H5管理后台Vue3 + ElementPlus + ECharts 数据看板实时通信WebSocket(状态推送)+(异步任务)物联网引擎RFID + 二维码 双模识别 + MQTT(设备状态上报)支付微信支付 + 支付宝部署JDK 17 + Docker + Nginx + K8s
核心功能模块1️⃣ 多角色体系(三端统一)java@PostMapping("/login")public Result<LoginVO> login(@Re LoginDTO dto) { User user = userService.login(dto); String token = JwtUtil.generateToken(user.getId(), user.getRole()); https:// role = "reader" 读者 / "admin" 管理员 return Result.success(new LoginVO(token, user.getRole()));}
角色核心功能使用端 读者端扫码借书/还书/续借/捐赠/阅读记录/在线支付小程序/H5/公众号 管理员端图书管理/读者管理/设备监控/数据统计/押金管理PC管理后台
⚠️ 本版本核心差异(vs 国内版 ¥8,889):
特性国内版(¥8,889)本版本(¥8,889/¥10,889)端口小程序 + 公众号 + H5小程序 + 公众号 + H5(三端完整)借阅方式扫码借阅RFID + 二维码双模 + 人脸识别逾期提醒短信提醒异步 + 微信模板消息捐赠功能基础捐赠捐赠审核 + 感谢反馈 + 积分奖励防超借Redis分布式锁Redis Lua原子脚本 + 乐观锁 + 分布式锁三重保障
2️⃣ 扫码借阅 + RFID双模识别(核心亮点)⭐⭐⭐java/** * 扫码借阅 - 分布式锁防超借 + RFID批量识别 * 传统2-3分钟 → 压缩至30秒以内 */@Service @Transactionalpublic class BorrowServiceImpl implements BorrowService { @Autowired private RedissonClient redissonClient; @Autowired private RabbitTemte rabbitTemte; /** * 扫码借阅 - 分布式锁防超借 + 押金冻结 + 借阅记录 */ @Lock4j(keys = {"#bookId"}, expire = 3000, ac = 1000) public Result borrow(Long userId, Long bookId) { https:// 1. 校验读者证状态 + 押金余额 ReaderCard card = readerCardMapper.selectByUserId(userId); if (card == null || card.getStatus() != 1) { return Result.fail("请先办理电子读书证"); } if (card.getDeposit() < 100) { return Result.fail("押金不足,请充值"); } https:// 2. 校验图书库存(Redis预扣) String stockKey = "stock:book:" + bookId; Long stock = redisTemte.opsForValue().decrement(stockKey); if (stock == null || stock < 0) { redisTemte.opsForValue().increment(stockKey); https:// 回滚 return Result.fail("该书已被借出,试试其他图书吧"); } https:// 3. 锁定库存并生成借阅订单 BookStock bookStock = bookStockMapper.selectById(bookId); bookStock.setStatus(1); https:// 1=已借出 bookStockMapper.updateById(bookStock); BorrowOrder order = new BorrowOrder(); order.setUserId(userId); order.setBookId(bookId); order.setBorrowTime(new Date()); order.setDueTime(DateUtil.offsetDay(new Date(), 30)); https:// 默认30天 order.setStatus(0); https:// 0=借阅中 orderMapper.insert(order); https:// 4. 冻结押金(钱包管理) walletService.freezeDeposit(userId, 100.00); https:// 5. 发送逾期提醒(异步,25天后触发) rabbitTemte.convertAndSend( "borrow.exchange", "borrow.overdue", order.getId(), message -> { message.getMessageProperties().setDelay(25 * 24 * 60 * 60 * 1000L); return message; } ); return Result.success("借阅成功!请取走图书。订单号:" + order.getId()); } /** * RFID批量借还 - 通过RFID天线阵列一次识别多本书 */ public Result rfidBatchBorrow(Long userId, List<Long> bookIds) { https:// 1. RFID天线阵列识别图书 List<RfidBook> rfidBooks = rfidService.scanBooks(bookIds); https:// 2. 批量校验库存(Lua原子脚本) String luaScript = "local key = KEYS[1]\n" + "local count = tonumber(ARGV[1])\n" + "local current = tonumber(redis.call('GET', key))\n" + "if current >= count then\n" + " redis.call('DECRBY', key, count)\n" + " return 1\n" + "else\n" + " return 0\n" + "end"; Boolean success = redisTemte.execute( new DefaultRedisScript<>(luaScript, Boolean.class), Collections.singletonList("stock:batch"), String.valueOf(bookIds.size()) ); if (uals(success)) { return Result.fail("部分图书库存不足"); } https:// 3. 批量创建借阅记录(异步) for (Long bookId : bookIds) { BorrowOrder order = new BorrowOrder(); order.setUserId(userId); order.setBookId(bookId); order.setBorrowTime(new Date()); order.setDueTime(DateUtil.offsetDay(new Date(), 30)); orderMapper.insert(order); } return Result.success("批量借阅成功,共" + bookIds.size() + "本"); }}
借阅方式说明耗时 扫码借阅微信扫图书二维码 → 校验 → 借阅<30秒 RFID借阅RFID天线阵列批量识别 → 一键借阅<15秒(多本) 人脸借阅人脸识别身份核验 + 活体检测<20秒 IC卡借阅实体卡/电子证刷卡借阅<10秒
| 借阅状态 | 流转说明 |
|----------|
| 0 借阅中 | 正在借阅 |
| 1 即将到期 | 剩余3天,发送提醒 |
| 2 已逾期 | 超期未还,扣除信用分 |
| 3 已归还 | 归还完成,解冻押金 |
| 4 已续借 | 续借成功,延长30天 |
3️⃣ 读书证管理 + 钱包系统(核心亮点)⭐⭐java/** * 电子读书证 - 多种证型 + 押金托管 + 信用评分 */@Servicepublic class ReaderCardService { /** * 办理电子读书证 */ @Transactional public Result createCard(Long userId, ReaderCardDTO dto) { https:// 1. 校验是否已有读书证 ReaderCard existing = readerCardMapper.selectByUserId(userId); if (existing != null) { return Result.fail("您已办理读书证"); } https:// 2. 创建读书证(默认押金100元) ReaderCard card = new ReaderCard(); card.setUserId(userId); card.setCardNo(generateCardNo()); card.setDeposit(100.00); card.setStatus(1); https:// 1=正常 card.setCreditScore(100); https:// 初始信用分100 card.setBorrowCount(0); card.setOverdueCount(0); readerCardMapper.insert(card); https:// 3. 冻结押金(钱包管理) walletService.freezeDeposit(userId, 100.00); return Result.success("读书证办理成功,押金已冻结"); } /** * 信用评分机制 - 动态调整 */ public void updateCreditScore(Long userId, String action) { ReaderCard card = readerCardMapper.selectByUserId(userId); int score = card.getCreditScore(); switch (action) { case "OVERDUE": score -= 10; break; https:// 逾期扣10分 case "RETURN_LATE": score -= 5; break; https:// 晚还扣5分 case "RETURN_EARLY": score += 5; break; https:// 早还加5分 case "DONATE": score += 20; break; https:// 捐赠加20分 } score = Math.max(0, Math.min(100, score)); https:// 0-100分 card.setCreditScore(score); readerCardMapper.updateById(card); https:// 信用分<60,限制借阅数量 if (score < 60) { card.setMaxBorrow(1); https:// 只能借1本 } else if (score < 80) { card.setMaxBorrow(3); } else { card.setMaxBorrow(5); } readerCardMapper.updateById(card); }}/** * 钱包管理 - 押金托管 + 自动退款 */@Servicepublic class WalletService { /** * 冻结押金(借书时) */ public boolean freezeDeposit(Long userId, BigDecimal amount) { return walletMapper.freeze(userId, amount) > 0; } /** * 解冻押金(还书时) */ @Transactional public boolean unfreezeDeposit(Long userId, BigDecimal amount) { https:// 1. 解冻 walletMapper.unfreeze(userId, amount); https:// 2. 扣除逾期费(如有) BigDecimal overdueFee = calculateOverdueFee(userId); if (overdueFee.compareTo(BigDecimal.ZERO) > 0) { walletMapper.deduct(userId, overdueFee); } https:// 3. 退回剩余押金 BigDecimal remaining = amount.subtract(overdueFee); walletMapper.refund(userId, remaining); return true; } /** * 逾期费计算 - 0.5元/天 */ private BigDecimal calculateOverdueFee(Long userId) { List<BorrowOrder> overdueOrders = orderMapper.selectOverdue(userId); BigDecimal totalFee = BigDecimal.ZERO; for (BorrowOrder order : overdueOrders) { long days = DateUtil.between(order.getDueTime(), new Date(), DateUnit.DAY); totalFee = totalFee.add(BigDecimal.valueOf(days * 0.5)); } return totalFee; }}
读书证类型说明押金 实体卡传统IC卡,支持刷卡借阅100元 电子证微信小程序电子证,扫码即用100元 身份证绑定实名认证 + 人脸核验0元(信用免押) 机构证学校/单位统一办理,批量授权机构承担
钱包功能说明 押金充值微信/支付宝充值,实时到账 押金冻结借书时自动冻结,还书时解冻 逾期扣费0.5元/天,自动从押金扣除 押金退款还书后自动退回剩余押金 流水记录每笔交易可查,账目透明
4️⃣ 图书管理 + 精准分类(核心亮点)⭐java/** * 图书管理 - 中图法分类 + ISBN扫码录入 + RFID定位 */@Servicepublic class BookServiceImpl implements BookService { /** * ISBN扫码自动填充图书信息(OCR + 豆瓣API) */ public Result addBookByISBN(String isbn) { https:// 1. 调用豆瓣API获取图书信息 BookInfo info = doubanAPI.getBookByISBN(isbn); if (info == null) { return Result.fail("未找到该图书,请手动录入"); } https:// 2. OCR识别封面补充元数据 String coverUrl = ocrService.recognizeCover(info.getCoverImage()); https:// 3. 创建图书记录 Book book = new Book(); book.setTitle(info.getTitle()); book.setAuthor(info.getAuthor()); book.setIsbn(isbn); book.setCategory(info.getCategory()); https:// 中图法分类 book.setTotalCopies(1); book.setAvailableCopies(1); book.setCoverUrl(coverUrl); book.setLocation("A区-3排-5层"); https:// RFID定位 book.setRfidCode(generateRFID()); https:// RFID标签 bookMapper.insert(book); return Result.success("图书录入成功"); } /** * 图书位置追踪 - RFID实时定位 */ public String getBookLocation(Long bookId) { return redisTemte.opsForValue().get("book:location:" + bookId); }}
分类维度说明 中图法分类A马克思主义 / B哲学 / C社会科学 / D政治法律 / E军事 / F经济 / G文化教育 / H语言文字 / I文学 / J艺术 / K历史地理 / N自然科学 / O数理化学 / P天文学 / Q生物科学 / R医药卫生 / S农业科学 / T工业技术 / U交通运输 / V航空航天 / X环境科学️ 热门标签畅销榜 / 新书推荐 / 经典必读 / 考试专用 年龄分级儿童 / 青少年 / 成人 位置追踪RFID智能书架,实时显示图书位置
5️⃣ 捐赠管理 + 社区互动java/** * 图书捐赠 - 审核制 + 积分奖励 */@Servicepublic class DonationService { /** * 提交捐赠 */ @Transactional public Result submitDonation(Long userId, DonationDTO dto) { Donation donation = new Donation(); donation.setUserId(userId); donation.setBookTitle(dto.getTitle()); donation.setIsbn(dto.getIsbn()); donation.setStatus(0); https:// 0=待审核 donation.setCreateTime(new Date()); donationMapper.insert(donation); https:// 异步通知管理员审核 rabbitTemte.convertAndSend("donation.exchange", "donation.new", donation.getId()); return Result.success("捐赠申请已提交,审核通过后将获得积分奖励"); } /** * 审核捐赠(管理员) */ @Transactional public Result auditDonation(Long donationId, boolean approved) { Donation donation = donationMapper.selectById(donationId); donation.setStatus(approved ? 1 : 2); https:// 1=通过 / 2=拒绝 donationMapper.updateById(donation); if (approved) { https:// 增加图书库存 bookService.addDonatedBook(donation); https:// 奖励积分 pointService.addPoints(donation.getUserId(), 50); https:// 发送感谢通知 wechatService.sendTemteMessage(donation.getUserId(), "捐赠审核通过", "感谢您的爱心捐赠,已获得50积分奖励!"); } return Result.success(approved ? "审核通过" : "已拒绝"); }}
捐赠流程说明 提交捐赠用户填写图书信息(ISBN扫码/手动录入)✅ 管理员审核审核图书是否符合要求 上架流通审核通过后上架,其他用户可借阅 积分奖励捐赠成功奖励50积分(可兑换免押借阅)
UniApp 前端核心页面
页面路径功能首页pages/index/index推荐图书/热门分类/新书上架/精准搜索图书列表pages/book/list分类筛选/关键词搜索/图书详情/收藏扫码借书pages/borrow/scan扫码/RFID感应 → 校验 → 确认借阅读书证pages/card/index办证/充值/押金/借阅记录/信用分捐赠pages/donate/index提交捐赠/审核进度/积分奖励订单管理pages/order/list借阅中/已归还/已逾期/续借钱包pages/wallet/wallet余额/押金/充值/流水/退款个人中心pages/user/user认证/收藏/借阅记录/设置
vue<!-- pages/borrow/scan.vue - 扫码借书(三端通用) --><temte> <view class="container"> <view class="scan-area"> <camera device-position="back" flash="off" @scan="onScan"/> <text class="tip"> 扫描图书二维码/RFID标签</text> </view> <view v-if="book" class="book-info"> <image :src="book.coverUrl" class="cover"/> <view class="info"> <text class="title">{{ book.title }}</text> <text class="author">{{ book.author }}</text> <text class="status" :class="book.available > 0 ? 'available' : 'unavailable'"> {{ book.available > 0 ? '✅ 可借阅' : '❌ 已借完' }} </text> </view> </view> <button v-if="book && book.available > 0" class="btn-borrow" @tap="confirmBorrow"> 确认借阅(冻结押金100元) </button> <view v-if="loading" class="loading"> <text>借阅中...</text> </view> <view v-if="success" class="success"> <text class="icon">✅</text> <text>借阅成功!请取走图书</text> <text class="order-no">订单号: {{ orderNo }}</text> </view> </view></temte><script>export default { data() { return { book: null, loading: false, success: false, orderNo: '' } }, methods: { async onScan(e) { this.loading = true; const res = await uest({ url: `${BASE_URL}/api/book/scan`, method: 'POST', data: { code: e.detail.result } }); this.loading = false; if (res.data.code === 200) { this.book = res.data.data; } }, async confirmBorrow() { this.loading = true; const res = await uest({ url: `${BASE_URL}/api/borrow/borrow`, method: 'POST', data: { bookId: this.book.id } }); this.loading = false; if (res.data.code === 200) { this.success = true; this.orderNo = res.data.data.orderNo; uni.vibrateShort({ type: 'heavy' }); } } }}</script>️ 核心数据库表
表名说明book图书表(标题/ISBN/作者/分类/库存/封面/RFID编码/位置)reader_card读书证表(用户ID/证号/押金/信用分/借阅次数/逾期次数)borrow_order借阅订单表(用户/图书/借出时间/应还时间/归还时间/状态/逾期费)donation捐赠表(用户/图书信息/审核状态/积分奖励)wallet_log钱包流水表(用户/金额/类型/关联订单)book_stock图书库存表(图书ID/状态/RFID位置)
s TABLE borrow_order ( id BIGINT PRIMARY KEY AUTO_INCREMENT, order_no VARCHAR(64) UNIQUE NOT NULL, user_id BIGINT NOT NULL, book_id BIGINT NOT NULL, borrow_time DATETIME NOT NULL, due_time DATETIME NOT NULL, return_time DATETIME, status TINYINT DEFAULT 0 COMMENT '0=借阅中 1=即将到期 2=已逾期 3=已归还 4=已续借', overdue_fee DECIMAL(10,2) DEFAULT 0 COMMENT '逾期费', deposit_frozen DECIMAL(10,2) DEFAULT 0 COMMENT '冻结押金', INDEX idx_user (user_id), INDEX idx_book (book_id), INDEX idx_status (status), INDEX idx_due_time (due_time));CREATE TABLE reader_card ( id BIGINT PRIMARY KEY AUTO_INCREMENT, user_id BIGINT UNIQUE NOT NULL, card_no VARCHAR(64) UNIQUE NOT NULL, deposit DECIMAL(10,2) DEFAULT 100.00 COMMENT '押金', credit_score INT DEFAULT 100 COMMENT '信用分 0-100', max_borrow INT DEFAULT 5 COMMENT '大借阅数', borrow_count INT DEFAULT 0, overdue_count INT DEFAULT 0, status TINYINT DEFAULT 1 COMMENT '1=正常 2=冻结 3=注销', INDEX idx_user (user_id)); 管理后台功能
模块功能 数据看板DAU/借阅量/归还量/逾期率/热门图书/捐赠统计 ECharts 图书管理增删改查/ISBN扫码录入/RFID绑定/分类管理/批量导入 读者管理读者列表/读书证审核/信用分管理/封禁 借阅管理借阅记录/归还处理/续借/逾期/导出报表 财务管理押金流水/逾期费统计/微信对账/支付宝对账/退款审核 捐赠管理捐赠审核/上架/积分发放/感谢反馈 设备监控RFID设备状态/智能门锁监控/摄像头画面 数据统计借阅排行榜/读者活跃度/图书流通率/信用分布
️ 部署架构┌──────────────────────────────────────────────────┐│ Nginx │├──────────┬──────────┬───────────┬──────────────────┤│ UniApp │ UniApp │ UniApp │ UniApp ││ 小程序 │ 公众号H5 │ H5 │ │├──────────┴──────────┴───────────┴──────────────────┤│ Spring Boot 集群(微服务) ││ ┌─────────┐ ┌─────────┐ ┌───────────────────────┐ ││ │借阅服务 │ │图书服务 │ │ 读书证/钱包/捐赠服务 │ ││ └─────────┘ └─────────┘ └───────────────────────┘ ││ ┌─────────┐ ┌─────────┐ ┌───────────────────────┐ ││ │RFID设备 │ │支付服务 │ │ 消息通知服务 │ ││ └─────────┘ └─────────┘ └───────────────────────┘ │├───────────────────────────────────────────────────┤│ MySQL(主从) │ Redis Cluster │ │ ES ││ RFID中间件 │ Seata(分布式事务) │├───────────────────────────────────────────────────┤│ Prometheus + Grafana │ Docker + K8s │└───────────────────────────────────────────────────┘ 售价与套餐(2026年5月新)
套餐价格包含内容套餐1¥8,889源码 + 技术文档 + 部署文档(不含搭建/维护)套餐2¥10,889源码 + 文档 + 首次搭建 + 1年维护更新 + 技术支持
后续年度技术服务费:¥2,000/年(含免费系统升级)
⚠️ 源码具有可复制性,不支持恶意退款
购买申明:禁止转卖/禁止开源社区传播/研究商业学习使用
官方联系方式(已核实 ✅)
渠道信息 ✅电话 ✅(西安省钱兄网络科技有限公司)邮@163.comCEO马晓东(96年创业者,西安科技大学毕业)公司西安省钱兄网络科技有限公司地址陕西省西安市高新区高新四路13号朗臣大厦A座11808演示站联系 QQ 710070994 获取管理后台 + 用户端演示地址购买链接互站网 https://www.huzhan.com/ 搜索"省钱兄JAVA无人借阅图书借阅"
系统亮点总结
特性说明✅ 三端覆盖小程序 + 公众号 + H5,UniApp一套源码✅ 双模借阅RFID批量识别 + 二维码扫码,30秒完成借阅✅ 三重防超借Redis分布式锁 + Lua原子脚本 + 乐观锁✅ 押金托管借书冻结/还书解冻/逾期自动扣费,资金闭环✅ 信用评分100分制动态调整,影响借阅数量上限✅ 捐赠系统审核制 + 积分奖励,促进图书流通✅ 逾期提醒异步 + 微信模板消息,双重触达✅ 高并发万人同时借阅不卡,削峰✅ 数据看板ECharts实时展示DAU/借阅量/逾期率/捐赠统计✅ 安全合规JWT + AES-256 + RSA-2048 + 哈希固化
获取源码:搜索 互站网(huzhan.com)"省钱兄JAVA无人共享无人借阅图书借阅系统" 或直接联系官方 QQ 710070994 获取演示站体验后下单。该系统与省钱兄的"无人健身房系统(¥8,889)"同属一个产品矩阵,核心差异在于:专注智慧图书借阅场景,支持RFID+二维码双模识别 + 押金托管自动结算 + 信用评分体系 + 捐赠积分激励 + 逾期智能提醒,更适合公共图书馆/高校图书馆/社区书屋/企业图书角/无人书柜运营商等需要无人化图书管理的场景。据行业分析报告显示,到2026年智慧图书馆市场规模将突破千亿,搭载无人借阅终端的图书流通率可提升40%以上,同时降低80%的人工管理成本,该系统正是为这一庞大市场量身打造。
省钱兄科技,无人共享系统,无人借阅,图书借阅