每周总结2

团队冲刺第五天计划

一、昨日遗留问题跟进

  1. 查询性能优化

    • 实现查询缓存机制
    • 优化复杂查询的SQL执行计划
  2. 并发控制验证

    • 设计压力测试方案
    • 模拟高并发借阅场景

二、今日核心开发任务

1. 借阅功能增强

扫码借书完整实现

@PostMapping("/borrow/qrcode")
@Transactional
public ResponseEntity<BorrowResponse> borrowByQrCode(@Valid @RequestBody QrCodeRequest request) {
    // 1. 二维码内容解析与验证
    QrCodeContent content = qrCodeService.decode(request.getQrCodeData());
    if (!content.isValid()) {
        throw new InvalidQrCodeException("Invalid QR code content");
    }
    
    // 2. 获取图书信息(带锁)
    Book book = bookRepository.findByIdWithLock(content.getBookId())
            .orElseThrow(() -> new BookNotFoundException(content.getBookId()));
    
    // 3. 检查用户借阅资格
    if (userService.isUserBanned(request.getUserId())) {
        throw new UserBannedException("User is banned from borrowing");
    }
    
    // 4. 执行借阅
    return ResponseEntity.ok(borrowService.borrowBook(
            new BorrowRequest(request.getUserId(), book.getId())));
}

2. 用户权限模块开发

基础权限控制实现

// 权限注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface RequireRole {
    UserRole value();
}

// 权限拦截器
public class AuthorizationInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        // 获取用户角色
        UserRole userRole = getCurrentUserRole(request);
        
        // 检查方法权限注解
        RequireRole annotation = ((HandlerMethod) handler).getMethodAnnotation(RequireRole.class);
        if (annotation != null && userRole.ordinal() < annotation.value().ordinal()) {
            throw new AccessDeniedException("Insufficient privileges");
        }
        return true;
    }
}

3. 热门推荐功能

增强版热门图书推荐

@Cacheable(value = "popularBooks", unless = "#result == null || #result.empty")
public List<BookDTO> getPopularBooks(int limit) {
    return bookRepository.findPopularBooks(PageRequest.of(0, limit)).stream()
            .map(book -> {
                BookDTO dto = convertToDTO(book);
                dto.setBorrowCount(getBorrowCount(book.getId()));
                return dto;
            })
            .collect(Collectors.toList());
}

三、关键技术解决方案

  1. 缓存策略

    • 使用Redis实现二级缓存
    • 设计缓存过期和刷新机制
  2. 权限控制

    • 基于角色的访问控制(RBAC)
    • JWT令牌集成方案
  3. 压力测试方案

    @SpringBootTest
    @ActiveProfiles("test")
    public class BorrowPressureTest {
        @Test
        public void testConcurrentBorrow() throws InterruptedException {
            int threadCount = 100;
            ExecutorService service = Executors.newFixedThreadPool(threadCount);
            CountDownLatch latch = new CountDownLatch(threadCount);
            
            for (int i = 0; i < threadCount; i++) {
                service.execute(() -> {
                    try {
                        borrowService.borrowBook(new BorrowRequest(1L, 1L));
                    } finally {
                        latch.countDown();
                    }
                });
            }
            
            latch.await();
            // 验证库存是否正确
        }
    }
    

四、测试计划

  1. 单元测试

    • 权限拦截器测试
    • 二维码解析服务测试
  2. 集成测试

    • 扫码借书全流程测试
    • 权限控制API测试
  3. 性能测试

    • 使用JMeter模拟并发借阅
    • 监控系统响应时间和资源占用

五、系统状态看板

模块 完成度 测试覆盖率 关键问题
图书查询 95% 85% 缓存刷新策略待确定
自助借阅 85% 75% 压力测试结果待分析
用户权限 50% 30% 权限树设计进行中
推荐系统 70% 60% 推荐算法需要进一步优化

六、风险与应对

  1. 风险:权限模块可能影响现有API响应时间

    • 应对:进行基准测试,优化权限检查流程
  2. 风险:缓存一致性问题

    • 应对:实现数据库变更时的缓存失效机制

今日重点:完成扫码借阅全流程开发,建立基础权限体系,同时为关键模块实施压力测试,确保系统在高并发场景下的稳定性。

posted @ 2025-04-21 23:58  马瑞鑫03  阅读(31)  评论(0)    收藏  举报