团队冲刺第四天
一、核心功能实现进度
- 图书查询功能增强
-
完成多条件复合查询接口
-
实现分页与排序功能
-
新增模糊查询支持(标题/作者/ISBN)
java
// 增强版图书查询服务
public PageadvancedSearch(BookQueryDTO queryDTO) {
Specificationspec = (root, query, cb) -> {
Listpredicates = new ArrayList<>(); if (StringUtils.hasText(queryDTO.getKeyword())) { predicates.add(cb.or( cb.like(root.get("title"), "%" + queryDTO.getKeyword() + "%"), cb.like(root.get("author"), "%" + queryDTO.getKeyword() + "%"), cb.like(root.get("isbn"), "%" + queryDTO.getKeyword() + "%") )); } if (StringUtils.hasText(queryDTO.getCategory())) { predicates.add(cb.equal(root.get("category"), queryDTO.getCategory())); } if (queryDTO.isAvailableOnly()) { predicates.add(cb.gt(root.get("availableCopies"), 0)); } return cb.and(predicates.toArray(new Predicate[0]));};
return bookRepository.findAll(spec, queryDTO.getPageable());
}
2. 自助借阅功能基础
- 实现借阅记录生成
- 图书库存自动扣减
- 基础事务控制
java
@Transactional
public BorrowResponse borrowBook(BorrowRequest request) {
// 使用悲观锁确保数据一致性
Book book = bookRepository.findByIdWithLock(request.getBookId())
.orElseThrow(() -> new BookNotFoundException(request.getBookId()));
if (book.getAvailableCopies() <= 0) {
throw new NoAvailableCopiesException(book.getTitle());
}
// 创建借阅记录
BorrowRecord record = new BorrowRecord();
record.setUserId(request.getUserId());
record.setBookId(book.getId());
record.setDueDate(LocalDateTime.now().plusDays(14));
borrowRecordRepository.save(record);
// 更新库存
book.setAvailableCopies(book.getAvailableCopies() - 1);
bookRepository.save(book);
return new BorrowResponse(record.getId(), book.getTitle(), record.getDueDate());
}
二、关键技术问题解决
- 并发借阅控制
public interface BookRepository extends JpaRepository<Book, Long> {
@Lock(LockModeType.PESSIMISTIC_WRITE)
@Query("SELECT b FROM Book b WHERE b.id = :id")
Optional<Book> findByIdWithLock(@Param("id") Long id);
}
- 查询性能优化
-- 添加数据库索引
CREATE INDEX idx_book_title ON book(title);
CREATE INDEX idx_book_author ON book(author);
CREATE INDEX idx_book_category ON book(category);
CREATE INDEX idx_book_available ON book(available_copies);
三、明日开发计划
- 借阅功能增强
- 实现扫码借书接口
@PostMapping("/borrow/qrcode")
public ResponseEntity<?> borrowByQrCode(@RequestBody QrCodeRequest request) {
// 解析二维码内容并验证
// 调用借阅服务
}
- 查询功能扩展
- 添加热门图书推荐
@Query(value = "SELECT b.* FROM book b " +
"JOIN (SELECT book_id, COUNT(*) as borrow_count " +
"FROM borrow_record GROUP BY book_id " +
"ORDER BY borrow_count DESC LIMIT 10) t " +
"ON b.id = t.book_id", nativeQuery = true)
List<Book> findPopularBooks();
- 异常处理增强
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(NoAvailableCopiesException.class)
public ResponseEntity<ErrorResponse> handleNoAvailableCopies(NoAvailableCopiesException ex) {
return ResponseEntity.status(HttpStatus.CONFLICT)
.body(new ErrorResponse("BOOK_UNAVAILABLE", ex.getMessage()));
}
}
四、当前系统状态
模块 | 完成度 | 测试覆盖率 | 关键问题
| 图书查询 | 90% | 75% | 复杂查询性能待优化 |
| 自助借阅 | 70% | 50% | 并发控制需压力测试 |
今日总结:核心查询和借阅功能已实现基础版本,解决了关键并发问题。明日重点完善借阅流程的异常处理和性能优化,同时开始用户权限模块的开发。

浙公网安备 33010602011771号