Files
AIclinicalresearch/docs/03-业务模块/ASL-AI智能文献/05-开发记录/2025-11-18-Week2-Day1-Bug修复.md
HaHafeng 66255368b7 feat(admin): Add user management and upgrade to module permission system
Features - User Management (Phase 4.1):
- Database: Add user_modules table for fine-grained module permissions
- Database: Add 4 user permissions (view/create/edit/delete) to role_permissions
- Backend: UserService (780 lines) - CRUD with tenant isolation
- Backend: UserController + UserRoutes (648 lines) - 13 API endpoints
- Backend: Batch import users from Excel
- Frontend: UserListPage (412 lines) - list/filter/search/pagination
- Frontend: UserFormPage (341 lines) - create/edit with module config
- Frontend: UserDetailPage (393 lines) - details/tenant/module management
- Frontend: 3 modal components (592 lines) - import/assign/configure
- API: GET/POST/PUT/DELETE /api/admin/users/* endpoints

Architecture Upgrade - Module Permission System:
- Backend: Add getUserModules() method in auth.service
- Backend: Login API returns modules array in user object
- Frontend: AuthContext adds hasModule() method
- Frontend: Navigation filters modules based on user.modules
- Frontend: RouteGuard checks requiredModule instead of requiredVersion
- Frontend: Remove deprecated version-based permission system
- UX: Only show accessible modules in navigation (clean UI)
- UX: Smart redirect after login (avoid 403 for regular users)

Fixes:
- Fix UTF-8 encoding corruption in ~100 docs files
- Fix pageSize type conversion in userService (String to Number)
- Fix authUser undefined error in TopNavigation
- Fix login redirect logic with role-based access check
- Update Git commit guidelines v1.2 with UTF-8 safety rules

Database Changes:
- CREATE TABLE user_modules (user_id, tenant_id, module_code, is_enabled)
- ADD UNIQUE CONSTRAINT (user_id, tenant_id, module_code)
- INSERT 4 permissions + role assignments
- UPDATE PUBLIC tenant with 8 module subscriptions

Technical:
- Backend: 5 new files (~2400 lines)
- Frontend: 10 new files (~2500 lines)
- Docs: 1 development record + 2 status updates + 1 guideline update
- Total: ~4900 lines of code

Status: User management 100% complete, module permission system operational
2026-01-16 13:42:10 +08:00

4.6 KiB
Raw Blame History

Week 2 Day 1 - Bug修复报告

日期: 2025-11-18
问题: 前端模块加载失败
状态: 已修复


🐛 问题描述

错误1: React Query未配置

Error: No QueryClient set, use QueryClientProvider to set one

原因: 主应用App.tsx缺少QueryClientProvider配置导致ASL模块使用useQuery Hook时报错。

错误2: Ant Design Spin警告

Warning: [antd: Spin] `tip` only work in nest or fullscreen pattern.

原因: Spin组件的tip属性只在特定模式下生效(spinning={true}或嵌套模式)。


修复方案

1. 添加QueryClientProvider主应用

文件: frontend-v2/src/App.tsx

修改内容:

// 添加import
import { QueryClient, QueryClientProvider } from '@tanstack/react-query'

// 创建QueryClient实例
const queryClient = new QueryClient({
  defaultOptions: {
    queries: {
      staleTime: 1000 * 60 * 5,          // 5分钟
      gcTime: 1000 * 60 * 10,            // 10分钟
      retry: 1,                          // 失败重试1次
      refetchOnWindowFocus: false,       // 窗口聚焦时不重新获取
    },
  },
})

// 包裹应用
function App() {
  return (
    <ConfigProvider locale={zhCN}>
      <QueryClientProvider client={queryClient}>  {/* ⭐ 新增 */}
        <PermissionProvider>
          <BrowserRouter>
            {/* ... */}
          </BrowserRouter>
        </PermissionProvider>
      </QueryClientProvider>  {/* ⭐ 新增 */}
    </ConfigProvider>
  )
}

作用:

  • 为整个应用提供React Query支持
  • 所有模块都可以使用useQueryuseMutation等Hooks
  • 配置了合理的缓存策略

2. 修复Spin组件ASL模块

文件: frontend-v2/src/modules/asl/index.tsx

修改内容:

// 修改前
<Spin size="large" tip="加载中..." />  // ❌ 警告

// 修改后
<Spin size="large" />  // ✅ 正确

原因: Suspense的fallback不需要显示tip文字。


🧪 验证结果

修复后测试

  1. 刷新浏览器,无报错
  2. 点击"AI智能文献",正常进入项目列表页
  3. 控制台无警告信息
  4. React Query正常工作

控制台输出

✅ No errors
✅ No warnings
✅ Application loaded successfully

📊 影响范围

受益模块

所有使用React Query的模块都可以正常工作

  • ASL模块AI智能文献- 主要受益
  • AIA模块AI问答- 未来可使用
  • PKB模块(知识库)- 未来可使用
  • 其他模块 - 统一的状态管理方案

技术价值

  1. 状态管理统一: 所有模块使用React Query
  2. 性能优化: 自动缓存、去重请求
  3. 用户体验: 更好的Loading状态管理
  4. 代码质量: 减少重复的状态管理代码

🎯 配置说明

React Query配置解析

const queryClient = new QueryClient({
  defaultOptions: {
    queries: {
      staleTime: 1000 * 60 * 5,          
      // 数据新鲜度时间5分钟内不重新获取
      // 适合大多数场景,减少不必要的请求
      
      gcTime: 1000 * 60 * 10,            
      // 垃圾回收时间10分钟后清除缓存
      // 保持合理的内存使用
      
      retry: 1,                          
      // 失败重试1次
      // 避免过多重试导致的性能问题
      
      refetchOnWindowFocus: false,       
      // 窗口聚焦时不重新获取
      // 减少不必要的网络请求
    },
  },
})

为什么选择这些配置?

配置项 原因
staleTime 5分钟 项目数据变化不频繁,减少重复请求
gcTime 10分钟 保持合理缓存,避免内存泄漏
retry 1次 快速失败,不过度重试
refetchOnWindowFocus false 用户切换窗口时不需要重新加载

📝 经验总结

1. React Query必须全局配置

问题: 忘记在主应用配置QueryClientProvider
教训: 新框架集成时先配置全局Provider

2. Ant Design组件使用需注意文档

问题: Spin组件的tip属性有使用限制
教训: 查阅官方文档理解组件API

3. 前端架构分层清晰很重要

收获:

  • 主应用App.tsx负责全局配置
  • 业务模块asl/)只关注业务逻辑
  • 清晰的职责划分避免问题

🚀 下一步

修复完成后,可以继续:

  1. 测试项目创建功能
  2. 测试后端API联调
  3. 继续Week 2 Day 2开发

修复时间: 10分钟
修复难度: 简单
影响范围: 全局

修复完成: 2025-11-18 21:15