团队冲刺第四天

一、核心功能实现进度

  1. 图书查询功能增强
  • 完成多条件复合查询接口

  • 实现分页与排序功能

  • 新增模糊查询支持(标题/作者/ISBN)
    java
    // 增强版图书查询服务
    public Page advancedSearch(BookQueryDTO queryDTO) {
    Specification spec = (root, query, cb) -> {
    List predicates = 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());
}

二、关键技术问题解决

  1. 并发借阅控制
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);
}
  1. 查询性能优化
-- 添加数据库索引
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);

三、明日开发计划

  1. 借阅功能增强
  • 实现扫码借书接口
@PostMapping("/borrow/qrcode")
public ResponseEntity<?> borrowByQrCode(@RequestBody QrCodeRequest request) {
    // 解析二维码内容并验证
    // 调用借阅服务
}
  1. 查询功能扩展
  • 添加热门图书推荐
@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();
  1. 异常处理增强
@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% | 并发控制需压力测试 |

今日总结:核心查询和借阅功能已实现基础版本,解决了关键并发问题。明日重点完善借阅流程的异常处理和性能优化,同时开始用户权限模块的开发。

posted @ 2025-04-20 20:41  马瑞鑫03  阅读(20)  评论(0)    收藏  举报