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:
116
backend/scripts/seed-modules.js
Normal file
116
backend/scripts/seed-modules.js
Normal file
@@ -0,0 +1,116 @@
|
||||
/**
|
||||
* 初始化 modules 表数据
|
||||
*
|
||||
* 运行: node scripts/seed-modules.js
|
||||
*/
|
||||
|
||||
import { PrismaClient } from '@prisma/client';
|
||||
|
||||
const prisma = new PrismaClient();
|
||||
|
||||
const MODULES = [
|
||||
{
|
||||
code: 'RVW',
|
||||
name: '智能审稿',
|
||||
description: '基于AI的稿件自动审查系统,支持稿约规范性评估和方法学评估',
|
||||
icon: 'FileTextOutlined',
|
||||
is_active: true,
|
||||
sort_order: 1,
|
||||
},
|
||||
{
|
||||
code: 'PKB',
|
||||
name: '个人知识库',
|
||||
description: '个人文档管理与智能检索系统,支持多格式文档上传和语义搜索',
|
||||
icon: 'BookOutlined',
|
||||
is_active: true,
|
||||
sort_order: 2,
|
||||
},
|
||||
{
|
||||
code: 'ASL',
|
||||
name: '智能文献',
|
||||
description: '文献筛选与管理系统,支持批量导入、AI辅助筛选和全文复筛',
|
||||
icon: 'ReadOutlined',
|
||||
is_active: true,
|
||||
sort_order: 3,
|
||||
},
|
||||
{
|
||||
code: 'DC',
|
||||
name: '数据清洗',
|
||||
description: '智能数据清洗与整理工具,支持双模型提取和AI辅助数据处理',
|
||||
icon: 'DatabaseOutlined',
|
||||
is_active: true,
|
||||
sort_order: 4,
|
||||
},
|
||||
{
|
||||
code: 'IIT',
|
||||
name: 'IIT管理',
|
||||
description: 'IIT项目管理系统,支持REDCap集成和项目协作',
|
||||
icon: 'ProjectOutlined',
|
||||
is_active: true,
|
||||
sort_order: 5,
|
||||
},
|
||||
{
|
||||
code: 'AIA',
|
||||
name: '智能问答',
|
||||
description: 'AI智能问答助手,提供临床研究相关问题的智能解答',
|
||||
icon: 'RobotOutlined',
|
||||
is_active: true,
|
||||
sort_order: 6,
|
||||
},
|
||||
{
|
||||
code: 'SSA',
|
||||
name: '智能统计分析',
|
||||
description: 'AI驱动的智能统计分析系统,提供高级统计方法和自动化分析',
|
||||
icon: 'BarChartOutlined',
|
||||
is_active: true,
|
||||
sort_order: 7,
|
||||
},
|
||||
{
|
||||
code: 'ST',
|
||||
name: '统计工具',
|
||||
description: '统计分析工具集,提供常用统计方法和数据可视化功能',
|
||||
icon: 'LineChartOutlined',
|
||||
is_active: true,
|
||||
sort_order: 8,
|
||||
},
|
||||
];
|
||||
|
||||
async function main() {
|
||||
console.log('🚀 开始初始化 modules 表...\n');
|
||||
|
||||
for (const module of MODULES) {
|
||||
const result = await prisma.modules.upsert({
|
||||
where: { code: module.code },
|
||||
update: {
|
||||
name: module.name,
|
||||
description: module.description,
|
||||
icon: module.icon,
|
||||
is_active: module.is_active,
|
||||
sort_order: module.sort_order,
|
||||
},
|
||||
create: module,
|
||||
});
|
||||
console.log(`✅ ${result.code} - ${result.name}`);
|
||||
}
|
||||
|
||||
console.log('\n========== 当前 modules 表数据 ==========\n');
|
||||
|
||||
const allModules = await prisma.modules.findMany({
|
||||
orderBy: { sort_order: 'asc' },
|
||||
});
|
||||
|
||||
console.table(allModules.map(m => ({
|
||||
代码: m.code,
|
||||
名称: m.name,
|
||||
描述: m.description?.substring(0, 30) + '...',
|
||||
状态: m.is_active ? '✅ 上线' : '❌ 下线',
|
||||
排序: m.sort_order,
|
||||
})));
|
||||
|
||||
console.log('\n✨ 初始化完成!');
|
||||
}
|
||||
|
||||
main()
|
||||
.catch(console.error)
|
||||
.finally(() => prisma.$disconnect());
|
||||
|
||||
Reference in New Issue
Block a user