feat(admin): Complete tenant management and module access control system

Major Features:
- Tenant management CRUD (list, create, edit, delete, module configuration)
- Dynamic module management system (modules table with 8 modules)
- Multi-tenant module permission merging (ModuleService)
- Module access control middleware (requireModule)
- User module permission API (GET /api/v1/auth/me/modules)
- Frontend module permission filtering (HomePage + TopNavigation)

Module Integration:
- RVW module integrated with PromptService (editorial + methodology)
- All modules (RVW/PKB/ASL/DC) added authenticate + requireModule middleware
- Fixed ReviewTask foreign key constraint (cross-schema issue)
- Removed all MOCK_USER_ID, unified to request.user?.userId

Prompt Management Enhancements:
- Module names displayed in Chinese (RVW -> 智能审稿)
- Enhanced version history with view content and rollback features
- List page shows both activeVersion and draftVersion columns

Database Changes:
- Added platform_schema.modules table
- Modified tenant_modules table (added index and UUID)
- Removed ReviewTask foreign key to public.users (cross-schema fix)
- Seeded 8 modules: RVW, PKB, ASL, DC, IIT, AIA, SSA, ST

Documentation Updates:
- Updated ADMIN module development status
- Updated TODO checklist (89% progress)
- Updated Prompt management plan (Phase 3.5.5 completed)
- Added module authentication specification

Files Changed: 80+
Status: All features tested and verified locally
Next: User management module development
This commit is contained in:
2026-01-13 07:34:30 +08:00
parent 5523ef36ea
commit d595037316
51 changed files with 3550 additions and 287 deletions

View File

@@ -1,3 +1,4 @@
import { useState, useEffect } from 'react'
import { useNavigate, useLocation } from 'react-router-dom'
import { Dropdown, Avatar, Tooltip } from 'antd'
import {
@@ -9,9 +10,11 @@ import {
BankOutlined,
} from '@ant-design/icons'
import type { MenuProps } from 'antd'
import { getAvailableModules } from '../modules/moduleRegistry'
import { getAvailableModulesByCode } from '../modules/moduleRegistry'
import { fetchUserModules } from '../auth/moduleApi'
import { usePermission } from '../permission'
import { useAuth } from '../auth'
import type { ModuleDefinition } from '../modules/types'
/**
* 顶部导航栏组件
@@ -28,9 +31,22 @@ const TopNavigation = () => {
const location = useLocation()
const { user: authUser, logout: authLogout } = useAuth()
const { user, checkModulePermission, logout } = usePermission()
const [availableModules, setAvailableModules] = useState<ModuleDefinition[]>([])
// 获取用户有权访问的模块列表(权限过滤)⭐ 新增
const availableModules = getAvailableModules(user?.version || 'basic')
// 加载用户可访问的模块
useEffect(() => {
const loadModules = async () => {
try {
const moduleCodes = await fetchUserModules()
const modules = getAvailableModulesByCode(moduleCodes)
setAvailableModules(modules)
} catch (error) {
console.error('加载模块权限失败', error)
setAvailableModules([])
}
}
loadModules()
}, [authUser])
// 获取当前激活的模块
const activeModule = availableModules.find(module =>